对 Java 程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后台线程运行,这个进程就会结束。
这里提到的前台线程和后台线程是一种相对的概念,新创建的线程默认都是前台线程,如果某个线程对象在启动之前调用 setDaemon ( true )语句,这个线程就变成一个后台线程。
案例:
class DamonThread implements Runnable { //创建 DamonThread类,实现 Runnable接口
public void run() { //实现接口中的 run()方发
while (true) {
System.out.println(Thread.currentThread().getName()+"---is running");
}
}
}
public class ExampleM06 {
public static void main(String[] args) {
System.out.println("main线程是后台线程吗?"+Thread.currentThread().isDaemon());
DamonThread dt = new DamonThread(); //创建一个 DamonThread对象 dt
Thread t = new Thread(dt,"后台线程"); //创建线程 t 共享 dt 资源
System.out.println("t 线程默认是后台线程吗?"+t.isDaemon());
//判断是否为后台线程
t.setDaemon(true); //将线程 t 设置为后台线程
t.start(); //调用 start()方法开启线程 t
for (int i=0;i<10;i++) {
System.out.println(i);
}
}
}
当开启线程 t 后,会执行死循环中的打印语句,但我们将线程 t 设置为后台线程后,当前台线程死亡后, JVM 会通知后台线程。由于后台线程从接受指令,到做出响应,需要一定的时间,因此,打印了几次“后台线程—is running.”语句后,后台线程也结束了。由此说明进程中只有后台线程运行时,进程就会结束。
注意:要将某个线程设置为后台线程,必须在该线程启动之前,也就是说 setDaemon()方法必须在 start()方法之前调用,否则会引发 IllegalThreadStateException 异常。