java - 如何使 ThreadPoolExecutor 使用双端队列?

标签 java threadpoolexecutor deque

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

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

最佳答案

您需要通过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;
        }
    }
}

关于java - 如何使 ThreadPoolExecutor 使用双端队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57179713/

相关文章:

java - 是否有任何队列实现在创建时限制容量?

java - 安卓 : Calculate sum and group by month (SQLite)

java - 在全屏图形之上添加一个 JComponent

java - CompletableFuture 强制重用线程

android - 如何停止在线程池执行器 Android 中运行的任务

java - 无法解决 Java 双端队列迭代错误

java - 在将 String 分解为多行时,如何设置 Eclipse 首选项以将 + 放在哪里?

java - 我在 SQLITE 中执行选择时出错

java - ThreadPoolExecutor - 在队列之前使用线程

c++ - 为什么双端队列使用的 RAM 比 C++ 中的 vector 多得多?