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

时间:2018-02-23 08:45:41

标签: java multithreading performance threadpool forkjoinpool

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

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

1 个答案:

答案 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直到它们全部完成。

这仅仅是因为系统上的核心数决定了线程池将保留多少个线程。当所有这些都被填充时,在释放一个线程之前不会执行新任务。

故事的寓意:当你知道它在内部运作的方式时,只使用线程池,这就是你想要它做的事情。