我目前有ExecutorService
,我想要以下内容:
我面临的问题是shutdown()
不会返回任何未执行的提交任务(事实上它会等到任务完成),而shutdownNow()
会突然尝试杀死所有已经存在的任务。
我该如何解决这个问题?
答案 0 :(得分:3)
您应该可以通过创建扩展ThreadPoolExecutor
并提供自己的关闭方法的类来完成此任务。
以下是如何完成此操作的示例,您可能希望根据需要进行调整(例如,提供更多构造函数方法)
public class MyExecutor extends ThreadPoolExecutor {
private final BlockingQueue<Runnable> queue;
public MyExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
this.queue = workQueue;
}
public List<Runnable> shutdownSpecial() {
ArrayList<Runnable> queued = new ArrayList<>();
queue.drainTo(queued);
this.shutdown();
return queued;
}
}
答案 1 :(得分:1)
您可以执行以下操作:
如您所知,ExecutorService ThreadPool实现使用BlockingQueue(有界或无界队列)作为持有者来保存您的作业(可运行)。
所以,考虑到你的要求你只需做这样的事情:
yourWorkqueue.clear();
之后,您可以致电
executor.shutdown();
AFAIK,当前正在执行的作业不在队列中。因此,当您清除作业队列时,池中的线程将继续处理手头的作业。