守护线程与线程阻塞
2026/8/24大约 1 分钟
守护线程与线程阻塞
了解守护线程的作用与使用注意事项,以及线程阻塞的四种情况。
用户线程与守护线程
Java 中有两类线程:
- 用户线程(User Thread):运行在前台的线程
- 守护线程(Daemon Thread):运行在后台的线程,为其他前台线程提供便利服务,如垃圾回收线程
退出规则:当 VM 检测到仅剩守护线程而用户线程都已退出时,VM 退出;只要有非守护线程存活,VM 就不会退出。
设置守护线程
Thread t = new Thread(task);
t.setDaemon(true); // 必须在 start() 之前设置
t.start();注意事项:
setDaemon(true)必须在start()之前调用,否则抛IllegalThreadStateException- 守护线程中产生的新线程也是守护线程
- 不要在守护线程中执行业务逻辑(如数据读写、计算)——无法保证在所有用户线程退出前守护线程已完成服务,一旦用户线程全部退出,VM 直接退出
线程阻塞的四种情况
| 阻塞方式 | 说明 | 是否可中断 |
|---|---|---|
Thread.sleep() | 阻塞到指定毫秒时间,或被打断 | 可中断 |
wait() | 阻塞到接到 notify、被中断或超时 | 可中断 |
| I/O 阻塞 | 如 InputStream.read() 阻塞到读到一个字节,可无限阻塞 | 不可中断 |
| 等待锁 | 等待获取 synchronized 语句需要的对象锁 | 不可中断 |