【问题标题】:How can I make a ThreadPoolExecutor use a deque?如何让 ThreadPoolExecutor 使用双端队列?
【发布时间】:2019-07-24 09:33:32
【问题描述】:

我需要一个线程池,它可以接收要插入到队列后面(像往常一样)或队列前面(用于优先任务)的任务。然后应该正常执行任务,从队列的头部轮询。

我意识到这意味着使用BlockingDeque 创建我自己的ThreadPoolExecutor,但这还不够……我如何真正告诉线程池调用队列的offerFirst 方法而不是offer

【问题讨论】:

  • 您能分享您为此编写的任何代码吗?这将有助于进行编辑以使您步入正轨
  • 也许您可以选择使用自定义 Comparator 和 BlockingQueue?像 BlockingQueue queue=new PriorityBlockingQueue(2,new CustomTaskComparator());然后在 CustomTaskComparator 中有 compareTo(Task a, Task b)?

标签: java threadpoolexecutor deque


【解决方案1】:

您需要将PriorityBlockingQueue 传递给ThreadPoolExecutor,可能使用此构造函数。下面添加了如何使用比较器初始化 PriorityBlockingQueue 的示例

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

编辑 - 将比较器添加到优先级队列的示例

import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class PriorityBlockQueueTest {

    private static BlockingQueue<PriorityTask> taskQueue = new PriorityBlockingQueue<>(10,
            new Comparator<PriorityTask>() {
        @Override
        public int compare(PriorityTask o1, PriorityTask o2) {
            return o2.getData() - o1.getData();
        }
    });

    public static void main(String arg[]) {
        taskQueue.add(new PriorityTask(2, 10));
        taskQueue.add(new PriorityTask(1, 11));

        System.out.println(taskQueue);
    }

    private static class PriorityTask implements  Runnable {
        private int priority;
        private int data;
        public PriorityTask(int priority, int data) {
            this.priority = priority;
            this.data = data;
        }

        public int getData() {
            return data;
        }

        public void run() {
            System.out.println("Running something");
        }

        public String toString() {
            return "priority: " + priority + " data: " + data;
        }
    }
}

【讨论】:

  • 用我自己的队列构建线程池很容易......我的问题是如何为任务设置优先级,如果它们很简单Runnables?
  • PriorityBlockingQueue 允许您指定一个比较器。在比较器中添加检查的实现
  • 添加了队列示例。你认为合适的类型转换
猜你喜欢
  • 2018-07-02
  • 2013-05-21
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
相关资源
最近更新 更多