守护线程
1.守护线程和非守护线程(用户线程)
Java分为两种线程:用户线程和守护线程。守护线程 是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:
- thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
- 在Daemon线程中产生的新线程也是Daemon的。
- 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
1.非守护线程和主线程
/**
* 守护线程和非守护线程与主线程的关系
* 用户线程是主线程创建的,它是非守护线程。
* 守护线程和主线程一起销毁
* @author duqingqing
* @date 2018年9月24日
*/
public class DaemonThread {
public static void main(String[] args) {
//thread1是用户线程,是主线程创建的
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<15;i++)
{
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("子线程 :"+i);
}
}
});
thread1.start();
//主线程
for(int j=0;j<5;j++) {
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("主线程 :"+j);
}
System.out.println("主线程完毕...");
}
}
子线程 :0 主线程 :0 主线程 :1 子线程 :1 子线程 :2 主线程 :2 主线程 :3 子线程 :3 主线程 :4 子线程 :4主线程完毕...
子线程 :5 子线程 :6 子线程 :7 子线程 :8 子线程 :9 子线程 :10 子线程 :11 子线程 :12 子线程 :13 子线程 :14
非守护线程不会受主线程的影响
2.守护线程和主线程的关系
/**
* 守护线程和非守护线程与主线程的关系
* 用户线程是主线程创建的,它是非守护线程。
* 守护线程和主线程一起销毁
* @author duqingqing
* @date 2018年9月24日
*/
public class DaemonThread {
public static void main(String[] args) {
//thread1是用户线程,是主线程创建的
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<15;i++)
{
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO: handle exception
}
System.out.print(" 子线程 :"+i);
}
}
});
thread1.setDaemon(true);//设置为守护线程
thread1.start();
//主线程
for(int j=0;j<5;j++) {
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO: handle exception
}
System.out.print(" 主线程 :"+j);
}
System.out.println("主线程完毕...");
}
}
主线程 :0 子线程 :0 子线程 :1 主线程 :1 子线程 :2 主线程 :2 子线程 :3 主线程 :3 主线程 :4主线程完毕...
子线程 :4
主线程销毁,守护线程销毁。