用户线程(前台线程): 应用程序必须运行完所有的用户线程才可以退出。 守护线程(后台线程): 应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的守护线程在应用程序退出时
用户线程(前台线程): 应用程序必须运行完所有的用户线程才可以退出。
守护线程(后台线程): 应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的守护线程在应用程序退出时都会自动结束。
用户线程
守护线程
优先级
高
低
与否不影响JVM的退出
是
否
是否任何时候中断
否
是
是否自动关闭
否
是
设置方式
setDaemon(false)
setDaemon(true)
典型场景
数据库连结、操作文件
GC垃圾回收、JIT线程等为用户线程服务的线程
/**
* 描述: 守护线程
*/
public class C2DamonThread implements Runnable {
/**
* 描述: 后台线程
*/
@Override
public void run() {
/* 模拟业务逻辑 */
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-------- is running... " + i);
}
}
/**
* 描述: 主线程
*/
public static void main(String[] args) throws InterruptedException {
/* 启动一个后台线程 */
C2DamonThread dt = new C2DamonThread();
Thread thread = new Thread(dt, "守护线程");
// 将线程thread设置成守护线程 该设置必须要在该线程启动之前
// 守护线程是为用户线程服务的。
// 虚拟机会等待用户线程结束后才结束。
// 虚拟机不会等待守护线程结束,所以守护线程会随时结束。
thread.setDaemon(true);
thread.start();
/* 模拟主线程业务逻辑 */
for (int i = 0; i < 10; i++) {
Thread.sleep(100);
System.err.println("用户主线程:" + i);
}
}
}
运行结果: