问题描述
我是否正确,每次执行几个提交操作时:
ExecutorService executor = Executors.newSingleThreadExecutor(
new MyThreadFactory("someExecutor"));
executor.submit(...);
executor.submit(...);
executor.submit(...);
方法java.util.concurrent.ThreadFactory#newThread
仅执行一次?
还是每次都执行并为每个Submit调用创建一个新线程?
1楼
每次都重复使用同一线程。
那就是线程池的美:通过减少每个任务的调用开销,避免创建新线程的成本。
您可以在文档中了解有关如何实际创建线程的更多信息。
2楼
当您查看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。一个新线程将仅创建一次并保持活动状态,直到您通过shutdown
或shutdownNow
执行程序为止方法。
从Executor
帮助器方法创建ThreadPoolExecutor
简便方法没有任何魔术,只需检查那里的代码即可:)