当前位置: 首页 > 知识库问答 >
问题:

Java执行者不排队一些任务

鲜于海
2023-03-14

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

当执行函数被调用时,像往常一样,使用核心线程,如果核心线程正在使用,则将任务放入队列,如果队列已满,则创建新线程,直到达到最大池大小。这是ThreaPoolExecator的标准行为。线程池执行器

在这部分之前一切都好。我可以使用此规范创建ThreadPoolExecutor。

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

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

共有1个答案

傅振濂
2023-03-14

不,我知道没有执行器服务可以将任务优先于其他任务运行。

但是你自己可以很容易地做到这一点。建立多个executor服务。一个用于低优先级任务,另一个用于高优先级任务。

在下面的示例中,我们假设一台12核的机器没有负担过重。我们为低优先级服务分配了1000个任务。我们为高优先级服务分配了三个任务。这三项重要任务将立即安排执行。

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

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

Project Loom将虚拟线程(也称为光纤)添加到Java的并发设施中。虚拟线程运行成本非常低,内存和CPU的使用效率更高,普通计算机可能能够处理数百万个线程。

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

基于早期访问Java18,使用Project Loom技术的OpenJDK实验性构建现已推出。

 类似资料:
  • 执行者即任务需要执行的人或者涉及到任务协同时的主要负责人,每个任务对应唯一执行者。参与者指的是需要关注进展的成员或协同任务的执行人。创建者指的是创建当前任务的人。任务的创建者默认为任务的参与者。

  • 我们有一个场景,提交给ThreadPoolExecitor的任务长时间运行。当线程池启动时,我们以核心池大小=5、最大池大小=20和队列大小为10启动它。在我们的应用程序中,大约有10个任务被提交。大多数时候,这些任务运行几分钟/小时,然后完成。但是有一种情况,所有5个任务都挂在I/O上。因此,我的核心池大小达到了最大值,但我的ThreadpoolExector队列未满。所以额外的5个任务从未有机

  • 要并行或异步运行一些东西,我可以使用ExecutorService:

  • 我使用JavaFX制作了一个GUI,有三个单选按钮,一旦用户单击提交并创建了另一个线程,并且根据检查了什么单选按钮,线程运行所需的输出并将结果输出到控制台。 但是当线程运行时(一个进程需要大约30秒才能完成),我可以检查任何放射性按钮。它创建另一个线程并与另一个正在进行的线程一起输出长时间。所以我的输出框只是一个乱七八糟的东西!我在看异步任务,但我不确定这是否与它有关。 以下是我需要的:如果一个任

  • 问题内容: 我正在学习 Java Concurrency in Practice, 并陷入了 8.3.1线程创建和拆除的 主题。以下脚注警告要保持为零。 有时,开发人员倾向于将核心大小设置为零,以使工作线程最终被拆除,因此不会阻止JVM退出,但这会在不使用a的线程池中引起一些奇怪的现象。他们的工作队列使用SynchronousQueue(就像newCachedThreadPool一样)。 如果池已

  • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样