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

Vij*_*sal 1 java multithreading executorservice threadpool

当我们使用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);
}
Run Code Online (Sandbox Code Playgroud)

Java的线程池是否提供了用于此目的的API,或者我们是否需要在我们的末端实现一个FIFO队列来实现此目的。如果 Java 的线程池不提供任何此类功能,我真的很想了解此功能不存在背后的原因,因为它对我来说似乎是一个非常常见的用例。这在技术上是不可能的(我认为这不太可能),还是只是一个失误?

JB *_*zet 5

这是默认行为。ScheduledThreadExecutor(尽管您没有安排任何事情,但您正在使用的)扩展自ThreadPoolExecutor. 提交给 a 的任务ThreadPoolExecutor将存储在 a 中BlockingQueue,直到有一个线程可用来获取并执行它们。并且队列是先进先出的。

javadoc对此进行了详细描述。