gpt4 book ai didi

Java 将 Runnable 对象插入到 ExecutorService 中

转载 作者:搜寻专家 更新时间:2023-10-31 20:04:40 25 4
gpt4 key购买 nike

我有一个线程池 ExecutorService 对象。在未来的某个时候,添加的任务将使用 submit() 方法完成。我的理解是submit会把提交的Runnable添加到待办任务列表的末尾。但是,我有一种情况,基于 boolean 值,我可能想将可运行对象提交到要执行的任务的前面。我不希望这影响当前任务,只是希望下一个完成的任务将是我刚刚给它的任务。下面复制了一个示例方法。我该怎么做?

谢谢

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);
}

最佳答案

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

编辑回应最新问题:

首先,让 ExecutorService 像

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

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

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

       public boolean offer(E e) {
if(doNow)
return linkedBlockingDequeInstance.offerFirst(e);
else
return linkedBlockingDequeInstance.offerLast(e);
}

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

关于Java 将 Runnable 对象插入到 ExecutorService 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com