Java 使用Executors.newSingleThreadExecutor()方便的示例
请有人告诉我一个现实生活中的例子,在哪里使用这种工厂方法比其他方法更方便 newSingleThreadExecutor 公共静态执行器服务newSingleThreadExecutor() 创建一个执行器,该执行器使用单个辅助线程在 无限队列。(但是请注意,如果此单线程终止 由于关机前执行过程中出现故障,将出现新的故障 如果需要执行后续任务,则替换它。)任务 保证按顺序执行,并且最多只能执行一个任务 在任何给定时间都处于活动状态。不同于其他等价物 newFixedThreadPool(1)保证返回的执行器不会 可重新配置以使用其他线程 提前谢谢 有没有人能告诉我一个现实生活中的例子,使用[newSingleThreadExecutor()factory方法]比其他方法更方便 我假设您正在询问何时使用单线程池而不是固定或缓存线程池 当我有许多任务要运行时,我使用单线程执行器,但我只需要一个线程来执行。当然,这与使用1的固定线程池相同。这通常是因为我们不需要它们并行运行,它们是后台任务,我们不想占用太多的系统资源(CPU、内存、IO)。我想将各种任务作为Java 使用Executors.newSingleThreadExecutor()方便的示例,java,multithreading,pooling,Java,Multithreading,Pooling,请有人告诉我一个现实生活中的例子,在哪里使用这种工厂方法比其他方法更方便 newSingleThreadExecutor 公共静态执行器服务newSingleThreadExecutor() 创建一个执行器,该执行器使用单个辅助线程在 无限队列。(但是请注意,如果此单线程终止 由于关机前执行过程中出现故障,将出现新的故障 如果需要执行后续任务,则替换它。)任务 保证按顺序执行,并且最多只能执行一个任务 在任何给定时间都处于活动状态。不同于其他等价物 newFixedThreadPool(1)保证
Callable
或Runnable
对象来处理,因此ExecutorService
是最佳的,但我只需要一个线程来运行它们
例如,我有许多我用spring注入的计时器任务。我有两种任务,我的“短期”任务在一个线程池中运行。虽然在我的系统中有几百个线程,但只有一个线程执行它们。他们执行常规任务,如检查磁盘空间、清理日志、转储统计数据等。。对于时间关键的任务,我在缓存线程池中运行
另一个例子是,我们有一系列的合作伙伴集成任务。它们不会占用很长时间,而且运行频率也很低,我们不希望它们与其他系统线程竞争,因此它们在单线程执行器中运行
第三个例子是,我们有一个有限状态机,其中每个状态变量将作业从一个状态转移到另一个状态,并在单个线程池中注册为
Runnable
。尽管我们有数百个变种,但在任何一个时间点只有一个任务是有效的,因此为该任务分配多个线程是没有意义的。当您需要一个轻量级服务时,它会很有帮助,因为轻量级服务只会方便延迟任务执行,并且您希望确保作业只使用一个线程。执行器.newSingleThreadExecutor()和执行器之间的区别。newFixedThreadPool(1)
很小,但在设计库API时会很有帮助。如果将返回的ExecutorService
公开给库的用户,并且库仅在执行器使用单个线程时才能正常工作(任务不是线程安全的),则最好使用Executors.newSingleThreadExecutor()
。否则,库的用户可能会通过以下操作破坏它:
ExecutorService e = myLibrary.getBackgroundTaskExecutor();
((ThreadPoolExecutor)e).setCorePoolSize(10);
,这对于执行器是不可能的。newSingleThreadExecutor()除了前面提到的原因之外,如果需要订购担保,您可能希望使用单线程执行器,也就是说,您需要确保提交的任务总是按照提交的顺序进行。因为我们不希望它们并行运行,并在Rolleball上消耗太多CPU资源。我添加了另一个例子,说明了这一点。