SingleThreadExecutor 和 ThreadFactory

SingleThreadExecutor and ThreadFactory

每次我们执行多个提交操作时,我说得对吗:

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

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

它每次都重复使用同一个线程。

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

您可以在 ThreadPoolExecutor 文档中阅读有关线程实际创建方式的更多信息。

当您查看 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只监控是否有超过core的线程,这里从来没有,因为core是1,max也是1。一个新的线程只会被创建一次,并且保持alive直到你关闭执行者通过 shutdownshutdownNow 方法。

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