【问题标题】:Java Thread Pool ExecutorService: Threads execution orderJava Thread Pool ExecutorService:线程执行顺序
【发布时间】:2014-06-29 15:04:45
【问题描述】:

当我们使用 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 的线程池不提供任何此类功能,我真的很想了解不存在此功能的原因,因为它对我来说似乎是一个非常常见的用例。 这在技术上是不可能的(我认为这不太可能),还是只是错过了?

【问题讨论】:

  • 哥们,它是用那个类的javadoc写的
  • 我希望那些 MyThread 对象只是命名错误,实际上并没有扩展 java.lang.Thread。它们应该只是Runnable 任务。执行者会给他们一个线程来执行。 (Thread 实现 Runnable 的事实是一个历史错误。)

标签: java multithreading threadpool executorservice


【解决方案1】:

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

这在the javadoc中有详细描述。

【讨论】:

  • 任务按先进先出顺序从队列中取出,但如果有多个工作线程,这不一定是它们完成的顺序。很难说这是否是 OP 所要求的。
  • 在我的测试中,任务没有按FIFO顺序开始,请您帮忙回答我的问题stackoverflow.com/questions/42153013/…
【解决方案2】:

线程不会被执行。线程是运行 taska 的实体,例如 RunnableCallable 。将这样的任务提交给执行器服务会将其放入内部BlockingQueue,直到它被线程池中的线程拾取。这仍然不会告诉您执行顺序,因为不同的类在实现Runnable时可以做不同的事情@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多