【问题标题】:Is ScheduledThreadPoolExecutor ok for doing multiple tasks at same time?ScheduledThreadPoolExecutor 可以同时执行多个任务吗?
【发布时间】:2013-03-11 18:53:49
【问题描述】:

ScheduledThreadPoolExecutor 的文档说 - 按照先进先出 (FIFO) 提交的顺序启用安排在完全相同的执行时间的任务。

这是否意味着应该同时完成的任务永远不会同时完成。而是以先进先出的顺序执行?

如果是这样,那么我使用哪个类比Timer 更好,并且也没有这个 FIFO 问题?

【问题讨论】:

    标签: java scheduled-tasks


    【解决方案1】:

    ScheduledThreadPoolExecutor 的工作方式是有一个“调度”或主线程来检查要执行的任务。

    如果它找到一个任务,它会将其委托给池中的“工作”线程。

    如果准备好执行多个任务,则一次“启动”一个,但根据 Java 的定义,一旦“启动”,后续处理是并发的。

    如果您有两个任务都通过执行程序同时安排,则它们完成的顺序可能因运行而异,除非您设置特定的控件,例如锁定、等待等...处理这个问题,取决于 java 的线程调度(java 如何将时间分配给内核上的线程)来确定如何以及何时处理什么。请注意,设置此类锁、等待等...是一项看似复杂的任务,容易出现竞争条件,导致意外死锁、活动锁等...

    【讨论】:

    • 谢谢。我在哪里可以获得有关 ScheduledThreadPoolExecutor 的一些好的教程?我真的需要解释这些东西是如何工作的,而不仅仅是 API 文档。多亏了你,我对每节课的目的有了更好的理解。 :)
    • 好吧,我建议您先回去考虑一下您在并发方面的要求。当您向线程池提交某些内容时,心态是“它会完成,非常接近我想要它的时间”。如果您需要以同步方式执行多个可运行文件,请注意这通常很难满足要求,并在可能的情况下考虑放宽它。如果您想发布一些详细信息,我很乐意提供帮助。一个开始了解更多关于 java 的好地方是:docs.oracle.com/javase/tutorial/essential/concurrency
    • 请告诉我这是什么意思——你需要几个 runnables 同步执行。如果我知道意思,那么我可以告诉你这是不是我的要求。谢谢。
    • 您是否真的需要同时执行多个任务,或者如果它们的同步时间在几毫秒到几秒之间就可以了吗?
    • 以秒为单位的差异有多大?我的用例 - 我想同时打开 20-30 个灯泡,最好是同时打开。毫秒的差异是可以的。但是,超过 2-3 秒的差异是不可接受的。我还能使用 ScheduledThreadPoolExecutor 吗?
    【解决方案2】:

    这取决于你的线程池的大小。如果您安排 1000 个任务在午夜触发,而您只有 25 个线程,那么最初只能执行 25 个,而其余的必须等待可用线程。这里的FIFO是指执行器将任务交给执行线程的顺序。

    【讨论】:

    • 好的,所以线程数应该 >= 任务数? ">" 包含在安全范围内,以防我们不知道在特定时间可能需要完成多少任务。
    • @Time:这些任务真的需要同时发生吗?如果您能解释驱动这一点的要求,这可能会有所帮助。
    • 正如其他答案所指出的,计划时间是将任务提交到执行池的时间。您需要多少线程是一个设计决定,回想一下,真正的同时执行需要并行执行,这受硬件内核的限制。
    【解决方案3】:

    请注意,文档谈论“启用”任务,而我们谈论的是 threadpool 执行器。 :-)

    这意味着任务将等待到指定的时间,然后将它们视为放入普通的ThreadPoolExecutor中。如果池中有足够的线程可用,所有这些任务将并行运行。

    只有当池中的活动任务多于可用线程时,才会有一些任务需要等待。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      相关资源
      最近更新 更多