为ScheduledThreadPoolExecutor
该文档称, - 定于完全相同的执行时间 任务中提交的先入先出(FIFO)的顺序启用。ScheduledThreadPoolExecutor是否可以同时执行多个任务?
这是否意味着应该在同一时间完成的任务,绝不会在同一时间完成。相反,它们是按FIFO顺序执行的?
如果是真的我用随后类比Timer
更好,也没有这个FIFO的问题?
为ScheduledThreadPoolExecutor
该文档称, - 定于完全相同的执行时间 任务中提交的先入先出(FIFO)的顺序启用。ScheduledThreadPoolExecutor是否可以同时执行多个任务?
这是否意味着应该在同一时间完成的任务,绝不会在同一时间完成。相反,它们是按FIFO顺序执行的?
如果是真的我用随后类比Timer
更好,也没有这个FIFO的问题?
一个的ScheduledThreadPoolExecutor工作的方式是有一个单一的“调度”或主站,它检查任务来执行线程。
如果它找到一个任务,它将它委托给池中的“工作者”线程。
如果有多个任务准备执行时,他们是“开锣”一次一个,虽然曾经“拉开序幕”,后续的处理是并发的,每个Java的定义。
如果您有两个任务都是通过执行程序同时计划的,那么它们的完成顺序可能因运行而异,除非您放入特定的控件,例如锁,等待等。为了处理这个问题,它取决于java的线程调度(java如何分配内核上的线程)来确定如何以及何时进行处理。请注意,设置这样的锁,等待等是一个看似复杂的任务,容易出现导致意外死锁,活锁等的竞争条件...
这取决于你的线程池的大小。如果您计划在午夜启动1000个任务,并且只有25个线程,则最初只能执行25个任务,而其他任务必须等待可用线程。这里的FIFO是指执行程序将任务交给执行线程的顺序。
请注意,文档讨论“启用”任务和我们正在谈论的线程池执行者。 :-)
这意味着任务会等到指定的时间,那么他们将被视为如果投入正常的ThreadPoolExecutor。如果池中有足够的线程可用,所有这些任务将并行运行。
只有当您有更多任务变得比池中可用线程活跃时,某些任务将不得不等待。
谢谢。我在哪里可以在ScheduledThreadPoolExecutor上获得一些很好的教程? 我真的需要解释这些事情是如何工作的,而不仅仅是API文档。感谢你,我对每个班级的目的有了更好的理解。 :) – Time 2013-03-11 20:10:06
那么,我建议你先回头考虑一下你的要求是什么并发。当你向线程池提交某些东西时,心态是“它会完成,非常接近我想要的时间”。如果您需要几个以锁步方式执行的可运行参数,请注意,这通常难以满足要求,如果可能,请考虑将其松动。如果您想发布一些细节,我很乐意提供帮助。一个开始学习更多关于java有什么的好地方在这里:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Taylor 2013-03-11 21:39:52
请告诉我这意味着什么 - 您需要几个以锁步执行的runnable。如果我知道这个意思,那么我可以告诉你这是否是我的要求。谢谢。 – Time 2013-03-11 21:44:51