请问有人告诉我一个真实的例子,使用这种工厂方法而不是其他人方便吗?
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor()
创建一个Executor,它使用一个工作线程来操作 无界队列。 (但请注意,如果此单个线程终止 由于在关机之前执行期间出现故障,新的将会 如果需要执行后续任务,取而代之。)任务是 保证按顺序执行,并且不会超过一个任务 在任何给定时间都有效。不同于其他等同物 newFixedThreadPool(1)保证不返回执行者 可重新配置以使用其他线程。
提前致谢。
答案 0 :(得分:13)
请问有人告诉我一个真实的例子,使用[
newSingleThreadExecutor()
工厂方法]而不是其他人方便吗?
我假设您询问何时使用单线程线程池而不是固定或缓存线程池。
当我有许多任务要运行时,我使用单线程执行程序,但我只想要一个线程来执行它。这与使用1的固定线程池相同。通常这是因为我们不需要它们并行运行,它们是后台任务,我们不想占用太多系统资源(CPU,内存,IO)。我想将Callable
或Runnable
对象作为各种任务来处理,因此ExecutorService
是最优的,但我需要的只是一个线程来运行它们。
例如,我有春天注入的一些计时器任务。我有两种任务,我的“短期”任务在一个线程池中运行。只有一个线程可以执行它们,即使我的系统中有几百个。它们执行常规任务,例如检查磁盘空间,清理日志,转储统计信息等。对于时间紧迫的任务,我在缓存的线程池中运行。
另一个例子是我们有一系列合作伙伴集成任务。它们不需要很长时间,并且它们很少运行,我们不希望它们与其他系统线程竞争,因此它们在单个线程执行器中运行。
第三个例子是我们有一个有限状态机,其中每个状态mutators将作业从一个状态转移到另一个状态,并在单个线程池中注册为Runnable
。即使我们有数百个mutators,但在任何一个时间点只有一个任务是有效的,因此为任务分配多个线程是没有意义的。
答案 1 :(得分:2)
Executors.newSingleThreadExecutor()
和Executors.newFixedThreadPool(1)
之间的差异很小,但在设计库API时可能会有所帮助。如果将返回的ExecutorService
公开给库的用户,并且只有当执行程序使用单个线程(任务不是线程安全的)时,库才能正常工作,则最好使用Executors.newSingleThreadExecutor()
。否则,您的库的用户可以通过这样做来打破它:
ExecutorService e = myLibrary.getBackgroundTaskExecutor();
((ThreadPoolExecutor)e).setCorePoolSize(10);
,Executors.newSingleThreadExecutor()
无法使用。
答案 2 :(得分:2)
除了已经提到的原因之外,当您需要订购保证时,您可能希望使用单线程执行程序,即您需要确保提交的任何任务始终按照提交的顺序发生。
答案 3 :(得分:0)
当您需要一个轻量级服务时,它很有用,它只是方便推迟执行任务,并且您希望确保只有一个线程用于该作业。