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直到你关闭执行者通过 shutdown
或 shutdownNow
方法。
从 Executor
辅助方法创建 ThreadPoolExecutor
的 shorthand 方法没有任何魔力,只需检查那里的代码 :)
每次我们执行多个提交操作时,我说得对吗:
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直到你关闭执行者通过 shutdown
或 shutdownNow
方法。
从 Executor
辅助方法创建 ThreadPoolExecutor
的 shorthand 方法没有任何魔力,只需检查那里的代码 :)