3.2 守护线程
/** * Author:Java中文社群 */ publicclass DaemonExample { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 10; i++) { // 打印 i 信息 System.out.println("i:" + i); try { // 休眠 100 毫秒 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }); // 设置为守护线程 thread.setDaemon(true); // 启动线程 thread.start(); } }
以上程序执行结果如下:
从上述结果可以看出,当线程设置为守护线程之后,整个程序不会等守护线程 for
循环 10 次之后再进行关闭,而是当主线程结束之后,守护线程只执行了一次循环就结束运行了,由此可以看出守护线程和用户线程的不同。
3.3 小结
守护线程是为用户线程服务的,当一个程序中的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程在 Java 体系中权重是比较低的。
4.守护线程注意事项
守护线程的使用需要注意以下三个问题:
- 守护线程的设置
setDaemon(true)
必须要放在线程的start()
之前,否则程序会报错。
- 在守护线程中创建的所有子线程都是守护线程。
- 使用
jojn()
方法会等待一个线程执行完,无论此线程是用户线程还是守护线程。
接下来我们分别演示一下,以上的注意事项。
4.1 setDaemon 执行顺序
当我们将 setDaemon(true)
设置在 start()
之后,如下代码所示:
public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 10; i++) { // 打印 i 信息 System.out.println("i:" + i + ",isDaemon:" + Thread.currentThread().isDaemon()); try { // 休眠 100 毫秒 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }); // 启动线程 thread.start(); // 设置为守护线程 thread.setDaemon(true); }