1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程
2.Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。
虚拟机中可能会同时有很多个线程在运行,只有当所有的非守护线程都结束的时候,虚拟机的进程才会结束,不管在运行的线程是不是main()线程。
3.Main主线程结束了(Non-daemon thread),如果此时正在运行的其他threads是daemon threads,JVM会使得这个threads停止,JVM也停下
如果此时正在运行的其他threads有Non-daemon threads,那么必须等所有的Non daemon线程结束了,JVM才会停下来
4.总之,必须等所有的Non-daemon线程都运行结束了,只剩下daemon的时候,JVM才会停下来,注意Main主程序是Non-daemon线程
会一直跑下去,因为main进程结束了,但 A 进程还没有结束,虚拟机不能退出,
main 线程一退出,虚拟机就退出了,因为剩下在跑的 a 线程是守护线程,虚拟机不管它的死活的,直接退出了。
2.Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。
虚拟机中可能会同时有很多个线程在运行,只有当所有的非守护线程都结束的时候,虚拟机的进程才会结束,不管在运行的线程是不是main()线程。
3.Main主线程结束了(Non-daemon thread),如果此时正在运行的其他threads是daemon threads,JVM会使得这个threads停止,JVM也停下
如果此时正在运行的其他threads有Non-daemon threads,那么必须等所有的Non daemon线程结束了,JVM才会停下来
4.总之,必须等所有的Non-daemon线程都运行结束了,只剩下daemon的时候,JVM才会停下来,注意Main主程序是Non-daemon线程
默认产生的线程全部是Non-daemon线程
显示代码打印01 class A implements Runnable{
02 public void run(){
03 for(;;){
04 System.out.println("Thread A run");
05 }
06 }
07
08 public static void main(String[] args){
09 System.out.println("Thread main started!");
10 try{
11 (new Thread(new A())).start();
12 } catch (Exception e){
13 }
14 System.out.println("Thread main ended!");
15 }
16 };
会一直跑下去,因为main进程结束了,但 A 进程还没有结束,虚拟机不能退出,
显示代码打印01 class A implements Runnable{
02 public void run(){
03 for(;;){
04 System.out.println("Thread A run");
05 }
06 }
07
08 public static void main(String[] args){
09 System.out.println("Thread main started!");
10 try{
11 Thread a = new Thread(new A());
12 a.setDaemon(true);
13 a.start();
14 } catch(Exception e){
15 }
16 System.out.println("Thread main ended!");
17 }
18 };
main 线程一退出,虚拟机就退出了,因为剩下在跑的 a 线程是守护线程,虚拟机不管它的死活的,直接退出了。