当前位置: 代码迷 >> java >> SingleThreadExecutor和ThreadFactory
  详细解决方案

SingleThreadExecutor和ThreadFactory

热度:65   发布时间:2023-07-26 14:14:34.0

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

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

方法java.util.concurrent.ThreadFactory#newThread仅执行一次? 还是每次都执行并为每个Submit调用创建一个新线程?

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

那就是线程池的美:通过减少每个任务的调用开销,避免创建新线程的成本。

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

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

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

保持活动状态仅监视是否有更多的核心线程,这里决不是这种情况,因为核心是1,最大也是1。一个新线程将仅创建一次并保持活动状态,直到您通过shutdownshutdownNow执行程序为止方法。

Executor帮助器方法创建ThreadPoolExecutor简便方法没有任何魔术,只需检查那里的代码即可:)