在 Java 里**“多线程怎么回收”**这个问题,其实要从两个层面理解:
下面系统讲一下。
✅ Java 线程不能手动“杀掉”或强制回收
✅ 线程的回收只能等线程自己执行完 / 退出
线程退出后:
- JVM 标记线程为终止状态
- 垃圾回收器(GC)回收
Thread对象- 操作系统回收内核线程和资源
run() 方法执行结束(最安全)Thread t = new Thread(() -> {
// 做事情
});
t.start();
当 run() 方法执行完:
✅ 这是最推荐的方式
ExecutorService(强烈推荐)ExecutorService pool = Executors.newFixedThreadPool(10);
pool.submit(() -> {
// 任务
});
pool.shutdown(); // 不再接收新任务
回收方式:
pool.shutdown(); // 平缓关闭
pool.shutdownNow(); // 尝试中断
✅ 线程池会复用线程 ✅ 不会频繁创建/销毁线程 ✅ 生产环境标准做法
thread.stop(); // 危险,可能造成数据不一致
thread.suspend();
thread.resume();
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 干活
}
System.out.println("线程安全退出");
});
t.start();
t.interrupt(); // 请求中断
或者响应 InterruptedException:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
✅ 中断是协作式的 ✅ 线程自己决定是否退出
Thread t = new Thread(() -> {});
t.setDaemon(true);
t.start();
特点:
⚠️ 守护线程中不要做重要资源释放
满足以下条件:
run() 结束)Thread 对象Thread t = new Thread(() -> {});
t.start();
t = null; // 等待 GC
✅ 线程对象和普通对象一样被 GC 回收
❌ 线程一直 while(true) 不退出
❌ 阻塞在 socket.accept() / queue.take()
❌ 忘记 shutdown() 线程池
❌ 静态变量持有线程引用
✔ 优先用 线程池
✔ 用 中断 而不是 stop
✔ 任务设计成可结束的
✔ 不用的线程池要 shutdown
✔ 守护线程只做非关键任务
如果你愿意,可以告诉我:
我可以直接帮你改代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。