2014-06-29 158 views
-1

当我们使用Java的Executor服务创建一个线程池并向这个线程池提交线程时,这些线程的执行顺序是什么?Java线程池ExecutorService:线程执行顺序

我想确保线程先提交,先执行。 例如,在下面的代码,我想先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

的Javadoc,我希望那些'MyThread'对象只是名不副实,并没有真正延伸' java.lang.Thread'。他们应该是'Runnable'任务。执行者会给他们一个线程来执行。 ('Thread'实现'Runnable'这个事实是一个历史性的错误。) – Boann

回答

4

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

这是在the javadoc详细说明。

+0

任务按FIFO顺序从队列中取出,但如果存在多个工作线程,则不一定是它们完成的顺序。很难说这是否是OP要求的。 – Boann

+0

在我的测试中,任务不是以FIFO顺序开始的,请你帮助我的问题http://stackoverflow.com/questions/42153013/why-tasks-in-threadpool-are-not-executed-follow- fifo-java?noredirect = 1#comment71472912_42153013? – Jaskey

1

线程无法执行。线程是运行taska的实体,如RunnableCallable。将这样的任务提交给执行者服务会将其置于其内部的BlockingQueue中,直到它从线程池中被线程获取。这仍然会告诉你任何关于执行不同类别的顺序可以做不同的事情,同时实施Runnable