请帮我看下面代码中线程泄漏的原因。即使在run()完成后(从安慰的打印语句验证)并且主方法已退出(从打印语句和分析器工具验证),TestThread
也不会收集垃圾回收。为什么运行ScheduleExecutorService的UserThread不会被垃圾收集
但是,如果TestThread
设置为守护程序线程,即t.setDaemon(true)
,则会收集垃圾回收。下面的代码只是一个示例代码,它说明了我的应用程序中的问题。我正在尝试使用一些预先存在的日程安排类(由其他人使用ScheduledExecutorService
设计)。我注意到,当我保持与类的多个Runnable
s时,创建的线程永远不会收集垃圾。
public class ThreadTest {
static void runThreadWithExecutor() {
final String name = "TestThread";
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, name);
t.setDaemon(false);
return t;
}
});
ses.schedule(new Runnable() {
@Override
public void run() {
System.out.println("entered " + name);
System.out.println("exiting " + name);
}},
2,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("entered main");
runThreadWithExecutor();
Thread.sleep(5000);
System.out.println("exiting main");
}
}
好信息约翰。一个调整。 'shutdown()'不会结束线程池中的所有线程,直到所有作业已提交完成。 – Gray
@格雷好点 –
谢谢你们。虽然我最初选择这个作为我接受的答案,但后来我选择了格雷的答案,因为如果没有格雷的答案,这个答案就不言自明。但是,这个回应给了我充分的解释,需要有信心修改代码:)并且它可以工作! – Kes115