阐述
Java线程中有两种线程:①用户线程 ②守护线程
用户线程:平时用到的普通线程均是用户线程
守护线程:指在程序运行的时候在后台提供一种通用服务的线程,守护线程是为用户线程服务的,当有用户线程在运行,那么守护线程同样需要工作,当所有的用户线程都结束时,守护线程也就会停止
守护线程使用方式
- 设置线程的Daemon为true,且必须在thread.start()之前设置
- Daemon线程中产生的新线程也是Daemon
- 守护线程不应该去访问固有资源,如进行读写操作(文件,数据库),因为守护线程是跟随用户线程的,当没有用户线程工作时,守护线程会立即结束
举例
- 没有守护线程时
public class Daemon { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("守护线程 线程结束..."); } }); // thread.setDaemon(true); //① thread.start(); System.out.println("用户线程 结束..."); } }运行结果:
证明当用户线程全部结束时,守护线程依旧可以执行
- 有守护线程时
public class Daemon { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("守护线程 线程结束..."); } }); thread.setDaemon(true); //① thread.start(); System.out.println("用户线程 结束..."); } }运行结果:
当所有的用户线程结束时,守护线程就结束了,不会继续执行
守护线程适用场景
- 不适合用于输入输出或计算操作
- 适用于辅助用户线程场景,如GC,内存管理