ExecutorService.shutDown()和ExecutorService.shutDownNow()之间的中间地带

时间:2014-03-27 14:20:07

标签: java executorservice

我目前有ExecutorService,我想要以下内容:

  • 不应接受任何新任务。
  • 当前任务仍应继续执行。
  • 应返回所有当前排队的任务。

我面临的问题是shutdown()不会返回任何未执行的提交任务(事实上它会等到任务完成),而shutdownNow()会突然尝试杀死所有已经存在的任务。

我该如何解决这个问题?

2 个答案:

答案 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,当前正在执行的作业不在队列中。因此,当您清除作业队列时,池中的线程将继续处理手头的作业。