2013-03-11 125 views
6

ScheduledThreadPoolExecutor该文档称, - 定于完全相同的执行时间 任务中提交的先入先出(FIFO)的顺序启用。ScheduledThreadPoolExecutor是否可以同时执行多个任务?

这是否意味着应该在同一时间完成的任务,绝不会在同一时间完成。相反,它们是按FIFO顺序执行的?

如果是真的我用随后类比Timer更好,也没有这个FIFO的问题?

回答

4

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

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

如果有多个任务准备执行时,他们是“开锣”一次一个,虽然曾经“拉开序幕”,后续的处理是并发的,每个Java的定义。

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

+0

谢谢。我在哪里可以在ScheduledThreadPoolExecutor上获得一些很好的教程? 我真的需要解释这些事情是如何工作的,而不仅仅是API文档。感谢你,我对每个班级的目的有了更好的理解。 :) – Time 2013-03-11 20:10:06

+0

那么,我建议你先回头考虑一下你的要求是什么并发。当你向线程池提交某些东西时,心态是“它会完成,非常接近我想要的时间”。如果您需要几个以锁步方式执行的可运行参数,请注意,这通常难以满足要求,如果可能,请考虑将其松动。如果您想发布一些细节,我很乐意提供帮助。一个开始学习更多关于java有什么的好地方在这里:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Taylor 2013-03-11 21:39:52

+0

请告诉我这意味着什么 - 您需要几个以锁步执行的runnable。如果我知道这个意思,那么我可以告诉你这是否是我的要求。谢谢。 – Time 2013-03-11 21:44:51

1

这取决于你的线程池的大小。如果您计划在午夜启动1000个任务,并且只有25个线程,则最初只能执行25个任务,而其他任务必须等待可用线程。这里的FIFO是指执行程序将任务交给执行线程的顺序。

+0

好吧,所以线程数应该> =任务数量?如果我们不知道在某个特定时间可能需要完成多少任务,则包含“>”作为安全余量。 – Time 2013-03-11 19:12:18

+1

@时间:这些任务实际上需要同时发生吗?如果你能解释推动这一点的要求,这可能会有所帮助。 – Taylor 2013-03-11 19:29:20

+1

正如其他答案已经指出的那样,计划时间是将任务提交给执行池的时间。这是一个设计决定你想要多少个线程,回想一下,真正的同时执行需要并行执行,这受到硬件内核的限制。 – 2013-03-11 19:30:15

1

请注意,文档讨论“启​​用”任务和我们正在谈论的线程池执行者。 :-)

这意味着任务会等到指定的时间,那么他们将被视为如果投入正常的ThreadPoolExecutor。如果池中有足够的线程可用,所有这些任务将并行运行。

只有当您有更多任务变得比池中可用线程活跃时,某些任务将不得不等待。

相关问题