线程组
使用线程组可以方便管理线程
ThreadGroup threadGroup = new ThreadGroup("threadGroup_1");//创建一个线程组
Thread t1 = new Thread(threadGroup, new MyThtead(),"t1");//创建线程并将其命名加入线程组
为线程组添加一个父线程
ThreadGroup threadGroup2 = new ThreadGroup(threadGroup,"threadGroup_2");
如果没有手动添加父线程组系统自动获取当前主线程的线程组(main)作为默认父线程组。
批量停止线程只需要停止线程所在的线程组
中断方法
threadGroup.interrupt();
守护线程与用户线程
守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程都是守护线程。与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以当系统只剩下守护进程的时候,java虚拟机会自动退出。
线程的daemon属性为true表示是守护线程,false表示是用户线程。
package com.example.demo.demo.threadGroupDemo;
/**
* daemon属性为true表示是守护线程
*/
public class DaemonDemo {
public static class MyThtead extends Thread{
public MyThtead(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.getName() +"开始执行"+(this.isDaemon() ? "我是守护线程" : "我是用户线程"));
}
}
public static void main(String[] args) {
MyThtead myThtead = new MyThtead("myThtead1");
// myThtead.setDaemon(true);//
myThtead.start();
System.out.println("线程结束!");
}
}
线程结束!
myThtead1开始执行我是用户线程
当前程序运行没有结束
主线程main运行完毕后,myThtead线程开始运行,当用户线程运行完毕后(案例中因为while循环方法永远不能结束),系统才会退出
设置守护线程,需要在start()方法之前进行
通过设置daemon的值,设置线程为守护线程再看看,运行结果
package com.example.demo.demo.threadGroupDemo;
/**
* daemon属性为true表示是守护线程
*/
public class DaemonDemo {
public static class MyThtead extends Thread{
public MyThtead(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.getName() +"开始执行"+(this.isDaemon() ? "我是守护线程" : "我是用户线程"));
//循环不退出方法
while (true)
;
}
}
public static void main(String[] args) {
MyThtead myThtead = new MyThtead("myThtead1");
// myThtead.setDaemon(true);//设置myThtead为守护线程
myThtead.start();
System.out.println("线程结束!");
}
}
运行结果
程序结束了
区别是设置了myThtead1线程为守护线程
结论:当程序中所有的用户线程执行完毕之后,不管守护线程是否结束,java虚拟机都会自动退出。