首页 文章

什么时候使用Executors.newSingleThreadExecutor()方便的例子

提问于
浏览
4

可以请有人告诉我一个真实的例子,哪个方便使用这种工厂方法而不是其他方法?

newSingleThreadExecutor public static ExecutorService newSingleThreadExecutor()创建一个Executor,它使用一个在无界队列中运行的工作线程 . (但请注意,如果此单个线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程 . )保证任务顺序执行,并且不会有多个任务处于活动状态在任何给定的时间 . 与其他等效的newFixedThreadPool(1)不同,保证返回的执行程序不可重新配置以使用其他线程 .

提前致谢 .

4 回答

  • 0

    除了已经提到的原因之外,当您需要订购保证时,您可能希望使用单线程执行程序,即您需要确保提交的任何任务始终按照提交的顺序发生 .

  • 2

    当您需要轻量级服务时,它非常有用,它只是方便延迟任务执行,并且您希望确保只有一个线程用于作业 .

  • 13

    请问有人告诉我一个真实的例子,使用[newSingleThreadExecutor()工厂方法]而不是其他方便吗?

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

    当我有许多任务要运行时,我使用单线程执行程序,但我只想要一个线程来执行它 . 这与使用1的固定线程池相同 . 通常这是因为我们不想占用过多的系统资源(CPU,内存,IO) . 我想将各种任务作为 CallableRunnable 对象来处理,所以 ExecutorService 是最佳的,但我只需要一个线程来运行它们 .

    例如,我有 Spring 天注入的一些计时器任务 . 我有两种任务,我的“短期”任务在一个线程池中运行 . 只有一个线程可以执行它们,即使我的系统中有几百个 . 它们执行常规任务,例如检查磁盘空间,清理日志,转储统计信息等 . 对于时间紧迫的任务,我在缓存的线程池中运行 .

    另一个例子是我们有一系列合作伙伴集成任务 . 它们不需要很长时间,并且它们很少运行,我们不希望它们与其他系统线程竞争,因此它们运行在单个线程执行程序中 .

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

  • 2

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

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

    ,这对于 Executors.newSingleThreadExecutor() 是不可能的 .

相关问题