请帮我在下面的代码中找到线程泄漏的原因。即使在 run() 完成(从控制台打印语句验证)并且主方法已退出(从 print 语句和分析器工具验证)之后,TestThread
也不会收集垃圾。
但是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");
}
}