【发布时间】:2018-08-03 07:00:19
【问题描述】:
我使用ForkJoinPool.commonPool().execute(runnable) 作为在我的应用程序的许多地方生成线程的便捷方式。但是在特定的调用中,调用线程中可运行的代码需要更多时间(超过 10 秒)。这可能是什么原因?如何避免?
编辑:根据@ben 的回答,避免线程池中长时间运行的进程似乎是解决方案。手动创建新线程解决了我的问题,而不是使用常见的 ForkJoinPool。
【问题讨论】:
-
你是不是很多地方都在使用公用池?默认情况下,它的线程数与内核数一样多,因此很容易填充。
-
您的池可能同时充满了太多任务。除此之外,我不完全确定为什么它会比生成线程慢,因为在内部它只是一个静态构造的线程池,不应该更慢(也不会慢 10 秒)
-
@ben 我碰巧延迟了将近 10 秒。
-
@kayaman 是的。我认为使用公共池将是一种有效的方式,因为它知道如何使用核心并将利用它。
-
@Loganathan 不要使用
@anyone,因为它的工作方式与@noone一样,即没有人收到通知。当您不需要线程池功能并且任务需要一秒钟或更长时间时,只需生成一个新线程,因为没有任何收获。线程池让您可以控制正在运行的任务数量,并且每个任务的开销要小得多(我猜,创建线程需要花费很多微秒)。
标签: java multithreading performance threadpool forkjoinpool