【发布时间】:2012-05-17 15:57:55
【问题描述】:
请帮我在下面的代码中找到线程泄漏的原因。 TestThread 即使在 run() 完成(通过控制台打印语句验证)并且主方法已退出(通过 print 语句和分析器工具验证)后也不会被垃圾收集。
但是,如果TestThread 设置为守护线程,即t.setDaemon(true),则会被垃圾回收。下面的代码只是一个示例代码,它说明了我的应用程序中的问题。我正在尝试使用一些预先存在的调度类(它是由其他人使用ScheduledExecutorService 设计的)。我注意到,当我继续为该类调度多个 Runnables 时,创建的线程永远不会被垃圾回收。
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");
}
}
【问题讨论】:
标签: java multithreading executorservice