Java将Runnable对象插入ExecutorService

Jon*_*Jon 5 java threadpool

我有一个线程池ExecutorService对象.在将来的某个时间,使用submit()方法添加任务.我的理解是提交将提交将提交的Runnable添加到要完成的任务列表的末尾.但是我有一种情况,基于布尔我可能想要将runnable提交到要执行的任务的前面.我不希望这会影响当前的任务,只是下一个完成的任务将是我刚刚给出的任务.以下再现示例方法.我该怎么做呢?

谢谢

private ExecutorService singleLoadPool = Executors.newSingleThreadExecutor();
public void submitTask(Runnable run, boolean doNow) {
    if (doNow)
        singleLoadPool.submitFront(run);  // This is the method I'm looking for
    else
        singleLoadPool.submit(run);
}
Run Code Online (Sandbox Code Playgroud)

Bha*_*kar 4

我的偏好是使用LinkedBlockingDeque. 它直接支持位置插入/删除 -putFirst(e)/takeFirst()并且putLast(e)/takeLast()- 这是您的主要要求 - 您不必Comparator为您的元素实现 a 。这也是有界的——这意味着它提供了针对 的安全性OutOfMemoryError。

编辑回应最新问题:

首先,有 ExecutorService 像

ExecutorService executorService = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, workQueue);

其次,重要的问题是:什么是workQueue?

是workQueue对任何实现的薄包装BlockingQueue,它将其所有方法委托给LinkedBlockingDeque它包含的实例,但offer()方法除外,该方法由 调用ThreadPoolExecutor并且需要重写,如下所示:

       public boolean offer(E e) {
       if(doNow)
         return linkedBlockingDequeInstance.offerFirst(e);
      else 
         return linkedBlockingDequeInstance.offerLast(e);
   }
Run Code Online (Sandbox Code Playgroud)

当然,当您重写任何方法时 - 您需要小心保护线程安全及其一般契约。这绝对需要仔细的思考和严格的测试。