前面已经提过了关于线程池的一些常用方法。现在着重说一下ThreadGroup
线程组表示一个线程的集合,此外线程组也可以包含其他线程组。线程组构成一棵树,在树中 除了初始线程组外,每个线程组都有一个父线程组。
线程组的构造方法:
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent,String name)
常用的方法如下:
activeCount():返回此线程组中活动线程的估计数
activeGroupCount():返回此线程组中活动线程组的估计数
enumerate(Thread[] list):把此线程组及其子组中的所有活动线程复制到指定数组中
用法举例:
int count=threadGroup.activeCount();
Thread[] t=new Thread[count];
threadGroup.enumerate(t);
若需要遍历该数据:
for(Thread thread:t){
System.out.println(thread.getName());
}
线程组比线程池的优势是可以了解线程的执行情况;而线程池比线程组的优势是对线程的管理。线程组的弊端是需要不断地创建线程 会增加内存开销
public static void main(String[] args) throws InterruptedException {
ThreadGroupDemo demo = new ThreadGroupDemo();
ThreadGroup threadGroup = new ThreadGroup("abc");
Thread t1 = new Thread(threadGroup, demo);
Thread t2 = new Thread(threadGroup, demo);
Thread t3 = new Thread(threadGroup, demo);
Thread t4 = new Thread(threadGroup, demo);
t1.start();
t2.start();
t3.start();
t4.start();
//Thread.sleep(2000);
int count = threadGroup.activeCount();
System.out.println("活跃线程数:" + count);
System.out.println("活跃线程组数:" + threadGroup.activeGroupCount());
Thread[] t = new Thread[count];
threadGroup.enumerate(t);
for (Thread thread : t) {
System.out.println("活跃线程名称:" + thread.getName());
}
}
@Override
public void run() {
synchronized (this) {
int num = 3;
while (num-- > 0) {
System.out.println("线程名字:" + Thread.currentThread().getName() + " " + num);
}
}
}
运行结果:
//将Thread.sleep注释
线程名字:Thread-0 2
活跃线程数:4
线程名字:Thread-0 1
活跃线程组数:0
活跃线程名称:Thread-0
活跃线程名称:Thread-1
线程名字:Thread-0 0
活跃线程名称:Thread-2
活跃线程名称:Thread-3
线程名字:Thread-1 2
线程名字:Thread-1 1
线程名字:Thread-1 0
线程名字:Thread-2 2
线程名字:Thread-2 1
线程名字:Thread-2 0
线程名字:Thread-3 2
线程名字:Thread-3 1
线程名字:Thread-3 0将Thread.sleep(2000)这段代码放开,运行结果:
线程名字:Thread-0 2
线程名字:Thread-0 1
线程名字:Thread-0 0
线程名字:Thread-1 2
线程名字:Thread-1 1
线程名字:Thread-1 0
线程名字:Thread-3 2
线程名字:Thread-3 1
线程名字:Thread-3 0
线程名字:Thread-2 2
线程名字:Thread-2 1
线程名字:Thread-2 0
活跃线程数:0
活跃线程组数:0运行结果不同的原因:不注释Thread.sleep(2000) sleep方法导致了主线程休眠,cpu的执行权被创建的几个线程抢去,所以2s之后线程均运行完成,也就没有活跃线程在线程组中了。而注释这句话,则会导致主线程和新创建的几个线程在互相的争夺cpu的执行权,所以会看到活跃线程在线程组中的现象
以上,若有什么错误,请指出 谢谢!