我有一个通过Executors.newFixedThreadPool()
创建的Java线程池,我想使用守护程序线程。
原因是这是一个GUI应用程序,我不希望这些线程导致程序在Window关闭后继续运行。
我实现了一个自定义ThreadFactory
,在其创建的主题上设置Thread.setDaemon(true)
。
课程是这样的:
import java.util.concurrent.ThreadFactory;
public class DaemonThreadFactory implements ThreadFactory{
public Thread newThread(Runnable runnable){
Thread thread = new Thread();
thread.setDaemon(true);
return thread;
}
}
由于某种原因,当DaemonThreadFactory
与Executors.newFixedThreadPool()
一起使用时,我的所有排队任务都不会被执行。如果我将其更改回常规ThreadFactory
,则可以正常工作。
我做错了什么?
答案 0 :(得分:5)
你没有将Runnable
传递给线程,所以没有代码可以执行:
@Override
public Thread newThread(Runnable runnable)
{
Thread thread = new Thread(runnable);
thread.setDaemon(true);
return thread;
}
答案 1 :(得分:3)
您忽略了传递给您的Runnable,Thread必须将其包裹起来。
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable);
否则你创建的线程实际上什么都不做。