SingleThreadExecutor和ThreadFactory

时间:2015-08-07 19:59:11

标签: java java.util.concurrent

每次我们执行多次提交操作时,我是否正确:

ExecutorService executor = Executors.newSingleThreadExecutor(
            new MyThreadFactory("someExecutor"));
executor.submit(...);
executor.submit(...);
executor.submit(...);

方法java.util.concurrent.ThreadFactory#newThread只执行一次?或者它每次执行并为每个提交调用创建一个新线程?

2 个答案:

答案 0 :(得分:1)

每次都重复使用相同的线程。

这就是线程池的优点:通过减少每任务调用开销来避免创建新线程的成本。

您可以在ThreadPoolExecutor文档中了解有关如何实际创建线程的更多信息。

答案 1 :(得分:1)

当您查看Executors代码时,您会看到它创建了ThreadPoolExecutor,其核心和最大线程设置为“1”并将活动时间保持为0:

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>(),
                                threadFactory));
}

keep alive仅监视是否存在更多核心线程,这在此情况从未如此,因为核心为1且max也为1.新线程将仅创建一次并保持活动状态,直到您通过以下方式关闭执行程序shutdownshutdownNow方法。

ThreadPoolExecutor辅助方法创建Executor的简写方法没有任何魔力,只需检查那里的代码:)