Java 执行者不排队一些任务

Java Executors not queue some task

我找不到任何符合我要求的遗嘱执行人。 我想要一个带有 corePoolSize、maximumPoolSize 和 BlockingQueue 的 ExecutorService;

调用execute函数时,和往常一样,使用核心线程,如果核心线程正在使用,则将任务放入队列,如果队列已满,则创建新线程,直到达到maximumPoolSize。这是 ThreaPoolExecutor 的标准行为。 ThreadPoolExecutor

这部分之前一切正常。我可以用这个规范创建一个 ThreadPoolExecutor。

但是对于某些任务,如果核心线程已满,请不要将它们排队创建新线程。但是如果 maximumPoolSize 达到则将任务排队但将任务放在第一位。

我该如何实现这样的需求,有没有我可以使用的内置功能。

不,我知道没有执行程序服务将任务的优先级 运行 排在其他任务之前。

多个执行器服务

但是您自己可以很轻松地有效地做到这一点。建立多个执行者服务。一个用于低优先级任务,另一个用于高优先级任务。

在下面的例子中,我们假设一台没有超载的12核机器。我们将一千个任务分配给低优先级服务。我们将三个任务分配给高优先级服务。三项重要任务将立即安排执行。

ExecutorService highPriorityExecutorService = Executors.newFixedThreadPool( 5 ) ;
ExecutorService lowPriorityExecutorService = Executors.newFixedThreadPool( 3 ) ;

顺便说一下,Project Loom 如果该团队成功的话,您的问题可能会变得毫无意义。性能可能会得到如此显着的提高,以至于在某些情况下,您对任务确定优先级的需求可能会消失。

Project Loom 将 virtual threads (a.k.a fibers) 添加到 Java 的并发设施中。虚拟线程 运行 非常便宜,内存使用效率更高,CPU,普通计算机可以处理数百万个线程。

JVM 将许多虚拟线程调度到主机操作系统管理的几个“真实”线程上。任何其工作块被立即搁置(“停放”)的虚拟线程,因为另一个虚拟线程被安排立即执行。在这种情况下,底层载体线程,主机 OS 线程不会阻塞。目标是在任何虚拟线程挂起时保持主机线程持续高效地工作。

基于早期访问 Java18.

,基于 Project Loom 技术的 OpenJDK 实验性构建现已可用