为什么 ForkJoinPool.commonPool().execute(运行nable) 需要更多时间来 运行 线程
Why does ForkJoinPool.commonPool().execute(runnable) take more time to run the thread
我正在使用 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();
}
评论两行之一。
我们创建了一些发送消息的 runnable,闲置 10 秒然后再次发送消息。很简单。
当为所有 Runnables 中的每一个使用线程时,所有 Runnables 发送 Runnable start
10 秒后,所有 Runnables 发送 Runnable end
.
当使用 commonPool() 时,只有一些人发送 Runnable start
10 秒,他们发送 Runnable end
,另一群人发送 Runnable start
,直到他们全部完成。
这仅仅是因为您系统上的核心数量决定了线程池将容纳多少线程。当所有线程都被填满时,只有释放一个线程才会执行新任务。
故事的寓意是:只有当您了解线程池的内部工作方式并且这就是您想要它执行的操作时,才使用线程池。
我正在使用 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();
}
评论两行之一。 我们创建了一些发送消息的 runnable,闲置 10 秒然后再次发送消息。很简单。
当为所有 Runnables 中的每一个使用线程时,所有 Runnables 发送 Runnable start
10 秒后,所有 Runnables 发送 Runnable end
.
当使用 commonPool() 时,只有一些人发送 Runnable start
10 秒,他们发送 Runnable end
,另一群人发送 Runnable start
,直到他们全部完成。
这仅仅是因为您系统上的核心数量决定了线程池将容纳多少线程。当所有线程都被填满时,只有释放一个线程才会执行新任务。
故事的寓意是:只有当您了解线程池的内部工作方式并且这就是您想要它执行的操作时,才使用线程池。