java.lang.ThreadGroup
- Java進程中的每一條線程都屬于某一線程組
- 如果線程實例化的時候沒有指定線程組,則默認所屬于父線程的線程組
- main線程屬于【java.lang.ThreadGroup[name=main,maxpri=10]】
- 可以有兩個同名的線程組,但實際上是兩個不同的組
線程組可實現的一些功能
通過線程組中斷一批線程
ThreadGroup中的interrupt()方法示例代碼
package test;
import java.util.logging.Logger;
public class Test {
private static final Logger log = Logger.getLogger(Test.class.getName());
public static void main(String[] args) {
log.info(Thread.currentThread().getName() + " start.");
Test t = new Test();
new Thread(new ThreadGroup("group1"), t.new SubManager(), "SubManager1").start();
new Thread(new ThreadGroup("group2"), t.new SubManager(), "SubManager2").start();
new Thread(t.new SubManager(), "SubManager3").start();
try {
Thread.sleep(2250);
} catch (InterruptedException e) {
log.severe(e.toString() + " @ " + Thread.currentThread().getName());
}
Thread.currentThread().getThreadGroup().list();
Thread.currentThread().getThreadGroup().interrupt();
}
class SubManager implements Runnable{
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
log.info(Thread.currentThread().getName() + " is running.");
new Thread(new SubRun(), "SubRun").start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.severe(e.toString() + " @ " + Thread.currentThread().getName());
break;
}
}
}
}
class SubRun implements Runnable{
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
log.info(Thread.currentThread().getName() + " is running.");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
log.severe(e.toString() + " @ " + Thread.currentThread().getName());
break;
}
}
}
}
}
運行結果
[Wed May 08 21:24:49 CST 2019] INFO: main start.
[Wed May 08 21:24:49 CST 2019] INFO: SubManager1 is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubManager3 is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubManager2 is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:49 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubManager1 is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubManager3 is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubManager2 is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:50 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubManager3 is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubManager1 is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubManager2 is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
[Wed May 08 21:24:51 CST 2019] INFO: SubRun is running.
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
Thread[SubManager3,5,main]
Thread[SubRun,5,main]
Thread[SubRun,5,main]
Thread[SubRun,5,main]
java.lang.ThreadGroup[name=group1,maxpri=10]
Thread[SubManager1,5,group1]
Thread[SubRun,5,group1]
Thread[SubRun,5,group1]
Thread[SubRun,5,group1]
java.lang.ThreadGroup[name=group2,maxpri=10]
Thread[SubManager2,5,group2]
Thread[SubRun,5,group2]
Thread[SubRun,5,group2]
Thread[SubRun,5,group2]
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubManager2
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubManager1
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubRun
[Wed May 08 21:24:51 CST 2019] SEVERE: java.lang.InterruptedException: sleep interrupted @ SubManager3