Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Executors.newSingleThreadExecutor()方便的示例_Java_Multithreading_Pooling - Fatal编程技术网

Java 使用Executors.newSingleThreadExecutor()方便的示例

Java 使用Executors.newSingleThreadExecutor()方便的示例,java,multithreading,pooling,Java,Multithreading,Pooling,请有人告诉我一个现实生活中的例子,在哪里使用这种工厂方法比其他方法更方便 newSingleThreadExecutor 公共静态执行器服务newSingleThreadExecutor() 创建一个执行器,该执行器使用单个辅助线程在 无限队列。(但是请注意,如果此单线程终止 由于关机前执行过程中出现故障,将出现新的故障 如果需要执行后续任务,则替换它。)任务 保证按顺序执行,并且最多只能执行一个任务 在任何给定时间都处于活动状态。不同于其他等价物 newFixedThreadPool(1)保证

请有人告诉我一个现实生活中的例子,在哪里使用这种工厂方法比其他方法更方便

newSingleThreadExecutor

公共静态执行器服务newSingleThreadExecutor()

创建一个执行器,该执行器使用单个辅助线程在 无限队列。(但是请注意,如果此单线程终止 由于关机前执行过程中出现故障,将出现新的故障 如果需要执行后续任务,则替换它。)任务 保证按顺序执行,并且最多只能执行一个任务 在任何给定时间都处于活动状态。不同于其他等价物 newFixedThreadPool(1)保证返回的执行器不会 可重新配置以使用其他线程

提前谢谢

有没有人能告诉我一个现实生活中的例子,使用[newSingleThreadExecutor()factory方法]比其他方法更方便

我假设您正在询问何时使用单线程池而不是固定或缓存线程池

当我有许多任务要运行时,我使用单线程执行器,但我只需要一个线程来执行。当然,这与使用1的固定线程池相同。这通常是因为我们不需要它们并行运行,它们是后台任务,我们不想占用太多的系统资源(CPU、内存、IO)。我想将各种任务作为
Callable
Runnable
对象来处理,因此
ExecutorService
是最佳的,但我只需要一个线程来运行它们

例如,我有许多我用spring注入的计时器任务。我有两种任务,我的“短期”任务在一个线程池中运行。虽然在我的系统中有几百个线程,但只有一个线程执行它们。他们执行常规任务,如检查磁盘空间、清理日志、转储统计数据等。。对于时间关键的任务,我在缓存线程池中运行

另一个例子是,我们有一系列的合作伙伴集成任务。它们不会占用很长时间,而且运行频率也很低,我们不希望它们与其他系统线程竞争,因此它们在单线程执行器中运行


第三个例子是,我们有一个有限状态机,其中每个状态变量将作业从一个状态转移到另一个状态,并在单个线程池中注册为
Runnable
。尽管我们有数百个变种,但在任何一个时间点只有一个任务是有效的,因此为该任务分配多个线程是没有意义的。

当您需要一个轻量级服务时,它会很有帮助,因为轻量级服务只会方便延迟任务执行,并且您希望确保作业只使用一个线程。

执行器.newSingleThreadExecutor()和
执行器之间的区别。newFixedThreadPool(1)
很小,但在设计库API时会很有帮助。如果将返回的
ExecutorService
公开给库的用户,并且库仅在执行器使用单个线程时才能正常工作(任务不是线程安全的),则最好使用
Executors.newSingleThreadExecutor()
。否则,库的用户可能会通过以下操作破坏它:

ExecutorService e = myLibrary.getBackgroundTaskExecutor();
((ThreadPoolExecutor)e).setCorePoolSize(10);

,这对于执行器是不可能的。newSingleThreadExecutor()

除了前面提到的原因之外,如果需要订购担保,您可能希望使用单线程执行器,也就是说,您需要确保提交的任务总是按照提交的顺序进行。

因为我们不希望它们并行运行,并在Rolleball上消耗太多CPU资源。我添加了另一个例子,说明了这一点。