【后台线程】
后台线程(Daemon Thread):运行在后台,他的任务是为其它的线程提供服务,又称为"守护线程"。JVM的垃圾回收线程就是典型的后台线程。
[ 特征 ]
如果所有的前台线程都死亡,后台线程会自动死亡。
调用Thread对象的setDaemon(true)方法可以将指定的线程设置成后台线程。
当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。
Thread类提供了一个isDaemon()方法,用来判断指定线程是否为后台线程。
【示例代码】
package com.Higgin.part02; class DaemonThread implements Runnable{ //定义后台线程的形成执行体和普通线程无区别 @Override public void run() { for(int i=0;i<1000;i++){ System.out.println(Thread.currentThread().getName()+"===="+i); } } } public class Demo02 { public static void main(String[] args) { DaemonThread dt=new DaemonThread(); Thread t1=new Thread(dt,"后台线程"); t1.setDaemon(true); //将此线程设置成后台线程!! t1.start(); //启动线程 for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+"===="+i); } //main线程运行到for循环结束,就算此时后台线程的执行体for循环未结束 ,也得结束线程! } }
【运行结果】
后台线程本来希望运行到i=999的,但是前台唯一的main主线程运行结束了,JVM自动退出,后台线程也会随之结束。
【小结】
从上面的代码看,主线程默认是前台线程,t1线程设置为后台线程。
【注意1】
并不是所有的线程默认都是前台线程,
前台线程创建的子线程默认是前台线程,
后台线程创建的子线程默认是后台线程。
【注意2】
前台线程死亡后,JVN会通知后台线程死亡,但从它收到指令到做出相应,需要一定的时间,而且要将某个线程设置为后台线程,必须要在该线程启动之前(比如本案例中main()方法的for循环之前),即setDaemon(true)必须在start()方法之前调用,否则会引发IllegalThreadStateException异常。
时间: 2024-10-29 01:24:47