先看看整个java的线程组体系
public static void main(String[] args) {
//TODO Auto-generated method stub
ThreadGrouptg = new ThreadGroup("新建线程组");
System.out.println(Thread.currentThread().getThreadGroup().getName());//main
System.out.println(tg.getParent().getName());//main
System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());//system
System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName());//java.lang.NullPointerException
}
--main方法所属的主线程所在的线程组:main,其他在main方法中创建的线程和线程组所属的线程组都是main线程组(包括主线程main),而tg 这个线程组虽然没有明显地加入 main线程组,但是会默认加入当前线程所在的线程组也就是main线程组,main线程组上一级的线程组为system线程组,这也是最顶级的线程组,再上面就没有了,这就是线程组的体系结构
线程和线程组关联的用法:
public class TreadGroupTest implementsRunnable {
/*@author : zhengrf1
* @date 创建时间:2017年3月9日 下午5:35:09
* @see java.lang.Runnable#run()
*/
@Override
publicvoid run() {
//TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"isbelong to"+Thread.currentThread().getThreadGroup().getName());
}
/**
*
*@author : zhengrf1
*@date 创建时间:2017年3月9日下午5:35:09
*/
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
ThreadGrouptg = new ThreadGroup("新建线程组");
Threadt1 = new Thread(tg,new TreadGroupTest());
Threadt2 = new Thread(tg,new TreadGroupTest());
t1.start();
t2.start();
}
}
输出:
Thread-0is belong to新建线程组
Thread-1is belong to新建线程组
批量管理线程组下面的线程:
public class TreadGroupTest implementsRunnable {
/*@author : zhengrf1
* @date 创建时间:2017年3月9日 下午5:35:09
* @see java.lang.Runnable#run()
*/
@Override
publicvoid run() {
//TODO Auto-generated method stub
while(true){
System.out.println(Thread.currentThread().getName()+"isbelong to"+Thread.currentThread().getThreadGroup().getName());
try{
Thread.sleep(1000);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
*@author : zhengrf1
*@date 创建时间:2017年3月9日下午5:35:09
*/
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
ThreadGrouptg = new ThreadGroup("新建线程组");
Threadt1 = new Thread(tg,new TreadGroupTest());
Threadt2 = new Thread(tg,new TreadGroupTest());
t1.start();
t2.start();
tg.setDaemon(true);
tg.interrupt();
}
}
--批量对tg下面的线程发送中止信号,看看源码:
public final void interrupt() {
int ngroupsSnapshot;
ThreadGroup[] groupsSnapshot;
synchronized (this) {
checkAccess();
for (int i = 0 ; i < nthreads ; i++) {
threads[i].interrupt();
}
ngroupsSnapshot = ngroups;
if (groups != null) {
groupsSnapshot =Arrays.copyOf(groups, ngroupsSnapshot);
} else {
groupsSnapshot = null;
}
}
for (int i = 0 ; i < ngroupsSnapshot ; i++) {
groupsSnapshot[i].interrupt();
}
}
--循环遍历组下的所有线程组,每个线程都调用threads[i].interrupt();,其他接口比如suspend(),resume(),这些都类似,循环每个线程调用同名接口。不过有个接口比较特殊,setDaemon(true)并没有循环组内线程进行守护线程设置。