gpt4 book ai didi

java - 为什么 ForkJoinPool.commonPool().execute(runnable) 需要更多时间来运行线程

转载 作者:行者123 更新时间:2023-12-02 11:35:55 25 4
gpt4 key购买 nike

我使用ForkJoinPool.commonPool().execute(runnable)作为在应用程序的许多地方生成线程的便捷方法。但在特定调用时,调用线程中可运行对象中的代码需要更多时间(超过 10 秒)。原因可能是什么?如何避免这种情况?

编辑:根据@ben的回答,避免线程池中长时间运行的进程似乎是解决方案。手动创建新线程解决了我的问题,而不是使用常见的 ForkJoinPool。

最佳答案

经过一些快速测试后我发现了这个问题。看下面的示例代码:

List<Runnable> runnables = new ArrayList<Runnable>();
for (int i = 0; i < 20; ++i)
{
runnables.add(() -> {
System.out.println("Runnable start");
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{

}
System.out.println("Runnable end");
});
}

for (Runnable run : runnables)
{
//ForkJoinPool.commonPool().execute(run);
//new Thread(run).start();
}

在两行之一中发表评论。我们创建了许多发送消息的可运行程序,闲置 10 秒然后再次发送消息。很简单。

当为每个 Runnable 使用线程时,所有 Runnable 发送 Runnable start 10 秒,所有 Runnable 发送 Runnable end

当使用 commonPool() 时,其中一些发送 Runnable start 10 秒后,它们发送 Runnable end ,另一群发送 Runnable start 直到全部完成。

这只是因为系统上的核心数量决定了线程池将容纳的线程数量。当所有线程都被填满时,新任务不会执行,直到一个线程被释放。

这个故事的寓意是:只有当您知道线程池内部工作方式并且这就是您希望它执行的操作时,才使用线程池。

关于java - 为什么 ForkJoinPool.commonPool().execute(runnable) 需要更多时间来运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48944159/

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