猿问

如何让 ThreadPoolExecutor 使用双端队列?

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

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


catspeake
浏览 109回答 1
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;        }    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答