后台(daemon)线程,是指程序运行的时候在后台提供一种通用服务的线程。当所有非后台线程结束时,程序也就结束了,程序中的所有后台线程也会被终止,而只要有非后台线程还在运行,程序也就不会结束,后台线程也会继续运行。
先看一个非后台线程的例子,定义一个简单的任务,每隔两秒输出调用该任务的线程信息:
public class SimpleDaemons implements Runnable { @Override public void run() { while(true){ try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread()); } } }
启动任务,调用main()函数的线程睡眠5s后输出”main“:
public class Main { public static void main(String[] args) { Thread t = new Thread(new SimpleDaemons()); t.start(); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main"); } }
此时t是非后台线程,运行程序输出:
Thread[Thread-0,5,main] Thread[Thread-0,5,main] main Thread[Thread-0,5,main] Thread[Thread-0,5,main] ...
我们将t设置为后台线程,在线程启动之前调用setDaemon()方法:
public class Main { public static void main(String[] args) { Thread t = new Thread(new SimpleDaemons()); t.setDaemon(true); t.start(); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main"); } }
运行程序输出:
Thread[Thread-0,5,main] Thread[Thread-0,5,main] main
只有三个输出就结束了,这是因为调用main()函数的线程睡眠5s,因此5s的时间中t线程输出两次,随后mian()函数结束,程序中没有运行任何非后台线程,程序结束,所有的后台线程也被杀死。