Java线程池ExecutorService:线程执行顺序

时间:2014-06-29 15:04:46

标签: java multithreading threadpool executorservice

当我们使用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的线程池没有提供任何这样的功能,我真的很有兴趣了解这个功能不存在的原因,因为它对我来说似乎是一个非常常见的用例。 技术上是不可能的(我认为这是不太可能的),还是仅仅是一次失败?

2 个答案:

答案 0 :(得分:4)

这是默认行为。 ScheduledThreadExecutor(你正在使用的,虽然你没有安排任何事情)从ThreadPoolExecutor延伸。提交给ThreadPoolExecutor的任务存储在BlockingQueue中,直到一个线程可用于获取并执行它们。队列是FIFO。

the javadoc中详细说明了这一点。

答案 1 :(得分:1)

线程不会被执行。线程是运行taska的实体,如RunnableCallable。将这样的任务提交给执行程序服务将把它放在它的内部BlockingQueue中,直到它被来自它的线程池的线程接收。这仍然不会告诉您执行的顺序,因为在实现Runnable

时,不同的类可以执行不同的操作