我正在使用ForkJoinPool.commonPool().execute(runnable)
作为在我的应用程序中的许多地方生成线程的便捷方法。但是在特定的调用中,调用线程中runnable中的代码需要更多的时间(超过10秒)。可能是什么原因?如何避免?
编辑:根据@ben的回答,避免在线程池中长时间运行的进程似乎是解决方案。手动创建新线程解决了我的问题,而不是使用常见的ForkJoinPool。
答案 0 :(得分:1)
经过一些快速测试后,我发现了这个问题。请查看以下示例代码:
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使用Threads发送Runnable start
10s时,所有runnables都会发送Runnable end
。
当使用commonPool()时,只有其中一些传递Runnable start
10s传递,他们发送Runnable end
,另一组发送Runnable start
直到它们全部完成。
这仅仅是因为系统上的核心数决定了线程池将保留多少个线程。当所有这些都被填充时,在释放一个线程之前不会执行新任务。
故事的寓意:当你知道它在内部运作的方式时,只使用线程池,这就是你想要它做的事情。