为了账号安全,请及时绑定邮箱和手机立即绑定

如何让 ThreadPoolExecutor 使用双端队列?

如何让 ThreadPoolExecutor 使用双端队列?

catspeake 2023-04-19 15:49:05
我需要一个线程池,它可以接收要插入到队列后面(像往常一样)或插入队列前面(对于优先级任务)的任务。然后任务应该正常执行,从队列的头部轮询。ThreadPoolExecutor我意识到这意味着使用 a创建我自己的BlockingDeque方法,但这还不够......我如何实际告诉线程池调用队列的offerFirst方法而不是调用队列的方法offer?
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您需要将 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;

        }

    }

}


查看完整回答
反对 回复 2023-04-19
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信