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

线程池执行器

凤棋
2023-03-14

我正在使用线程池执行器更改遗留设计。详情如下:-

遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。

新:-在新设计中,我将线程池替换为执行器服务

 ThreadPoolExecutor thpool = new ThreadPoolExecutor(coreSize,poolsize,...);

我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。

但我的问题是,这样做是否正确,因为线程创建也是一种开销,这是在触发调用时发生的。

请告诉我们哪个线程更重,在客户端调用时创建进程线程,还是按照传统方法在内存中创建空闲线程。

还建议使用哪个执行器池,以便在性能方面获得最佳结果。

共有3个答案

顾琛
2023-03-14

600听起来像很多。您可能希望将其降低到可用处理器的数量。或者,如果线程最终等待了很长时间,那么如果您的线程不是100%受CPU限制的,那么所产生的平均负载的因素就是TPE的可运行性。假设您有nCPUs=Runtime。getRuntime()。availableProcessors()和加载因子(loadFactor)作为线程上的平均负载(在测试中观察到的,或者更好的是,在连续监控中观察到的)。然后使用nThreads=nCPUs/loadFactor,希望loadFactor不是零。

您还可以使用较小的coresize和较大的poolsize,但接下来需要一个有界队列。如果队列已满,则本例中的TPE将启动新线程,直到达到池大小。如果您的大多数作业都是在coresize中处理的,那么线程创建不应该太频繁,开销也不应该是一个问题。但即使这样,当TPE运行其最大线程数时,最终也可能会阻塞。

如果您的作业是某种传入的工作,例如从其他连接的套接字读取,而该套接字不能阻止,那么您可以创建一个无边界的中间队列,以释放入站处理,使其最终不会在您的TPE上阻塞,并使用另一个线程将作业从中间提交到TPE队列。

郭琦
2023-03-14

您可以拨打:

thpool.prestartAllCoreThreads();

thpool.prestartCoreThread();

这两种方法启动一个核心线程(线程),使其无所事事地等待工作。

但我建议不要这样做,这将直接占用您的资源。

朱啸
2023-03-14

要在启动时修复600个线程,请尝试使用java。util。同时发生的遗嘱执行人。newFixedThreadPool(600);

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多n个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交其他任务,则它们将在队列中等待,直到有线程可用。如果任何线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将替换一个新线程。池中的线程将一直存在,直到显式关闭。

如您所见,留档不会告诉我们线程是立即启动还是按需启动。

如果您想要启动时启动的600个线程,可以发布600个空任务:

for( int i = 0; i < 600; ++i ) {
   executor.submit( new Runnable(){public void run(){/**/}});
}
 类似资料:
  • 我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- > 如果有理想的线程,并且随着任务的到来,将该任务分配到队列中,而不是将其添加到队列中。 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了线程池执行程序的java 1.5版本的执行方法。 新守则如下:- 遗留代码如下所示:- 现在正

  • Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。

  • 我使用线程池执行器,将其替换为旧版线程。 我创建了如下执行器: 这里的核心大小是maxpoolsize/5。我已经在应用程序启动时预先启动了所有核心线程,大约160个线程。 在传统设计中,我们创建并启动了大约670个线程。 但关键是,即使在使用Executor并创建和替换遗留设计之后,我们也不会得到更好的结果。 对于结果内存管理,我们使用Top命令来查看内存使用情况。对于时间,我们将System.

  • 我们正在对使用SpringBoot 2.2.2和Spring执行器的应用程序进行性能测试。 我们希望监控: 正在使用多少tomcat线程 有多少tomcat请求正在排队 正在使用多少个ThreadPoolTaskExector线程(我们将@Async与线程池一起用于某些任务) 执行器中是否提供此信息?我看不到需要使用哪些指标。

  • ConsumptionExecutor: 然而,我想使用Akka流/Akka Actor,在这里我不需要给出固定的线程池大小,Akka负责所有的事情。我对Akka和流媒体和演员的概念很陌生。有人能给我任何线索,以示例代码的形式,以适合我的用例?提前道谢!

  • 我需要帮助设计基于多线程的应用程序,包括动态url创建和线程处理。 我在我的应用程序中使用了一个Spring调度器,它每30秒调度一次。从这个调度方法中,我调用了一些基于服务的api,它在循环中,而且我需要每个API有一个线程池执行器,上面有一个线程处理。 由于这个过程是从计划方法开始的,所以每次创建新的线程池时,这就是问题所在。你可以在代码中看到。 我想要的是,如果对于任何一个应用编程接口,如果