当我们使用Java的Executor服务创建一个线程池并将线程提交到这个线程池时,这些线程的执行顺序是什么?
我想确保首先提交线程,先执行。 例如,在下面的代码中,我希望首先执行5个线程,然后是接下来的5个线程,依此类推......
// Create a thread pool of 5 threads.
ScheduledExecutorService exService = Executors.newScheduledThreadPool(5, new ModifiedThreadFactory("ReadThreadPool"));
// Create 100 threads.
MyThread[] threads = createMyThreads(100);
// Submit these 100 threads to thread pool for execution.
for(MyThread thread : threads) {
exService.submit(thread);
}
Java的线程池是否为此提供了任何API,或者我们是否需要在我们的端部实现FIFO队列来实现此目的。 如果Java的线程池没有提供任何这样的功能,我真的很有兴趣了解这个功能不存在的原因,因为它对我来说似乎是一个非常常见的用例。 技术上是不可能的(我认为这是不太可能的),还是仅仅是一次失败?
答案 0 :(得分:4)
这是默认行为。 ScheduledThreadExecutor
(你正在使用的,虽然你没有安排任何事情)从ThreadPoolExecutor
延伸。提交给ThreadPoolExecutor
的任务存储在BlockingQueue
中,直到一个线程可用于获取并执行它们。队列是FIFO。
the javadoc中详细说明了这一点。
答案 1 :(得分:1)
线程不会被执行。线程是运行taska的实体,如Runnable
和Callable
。将这样的任务提交给执行程序服务将把它放在它的内部BlockingQueue
中,直到它被来自它的线程池的线程接收。这仍然不会告诉您执行的顺序,因为在实现Runnable