【问题标题】:How can I implement FIFO queue of threads?如何实现线程的FIFO队列?
【发布时间】:2014-08-24 17:16:09
【问题描述】:

如何实现线程的 FIFO 队列(要执行的任务)并一一执行线程? 我的意思是,例如,获取第一个线程并运行它,第二个必须等待第一个线程的执行结束。 同时我必须能够将线程(任务)添加到队列中。

【问题讨论】:

  • 如果它们要连续运行,为什么还需要多线程呢?一个线程不能完成所有任务吗?
  • 你真的需要它们成为线程吗?既然你要按顺序执行它们,我看不出重点……但我不知道整个故事……
  • 我必须使用这种方式,因为这是一项消耗 CPU 的任务,同时系统正在执行其他重要工作。
  • 当你的意思是“任务”时不要说“线程”。线程执行任务。我喜欢 Vakh 的回答和 Tucker Down 的回答:构建您的应用程序以使用 ExecutorService 来执行任务,然后,如果您希望这些任务连续执行,请选择仅使用一个线程的 ExecutorService。

标签: java multithreading


【解决方案1】:

创建一个只有一个线程的FixedThreadPool 并向其提交任务。它们将一个接一个地执行,就像在 FIFO 队列中一样:

ExecutorService es = Executors.newFixedThreadPool(1); // one thread only
// ...
for(Runnable r : myRunnables) {
    es.submit(r);
}

【讨论】:

    【解决方案2】:

    如果您希望所有线程同时运行,但又不希望它们使用特定资源或任务,则可以使用Synchronized Methods

    【讨论】:

      【解决方案3】:

      正如 Vakh 所说,使用 ExecutorService 来运行线程,但我建议使用 SingleThreadExecutor。 SingleThreadExectutor 保证按顺序执行线程,因为与FixedThreadPool 不同,它不能重新配置为使用不同数量的线程。

      ExecutorService es = Executors.newSingleThreadExecutor(); // one thread only
      // ...
      for(Runnable r : myRunnables) {
          es.submit(r);
      }
      

      您也可以调用Thread.join() 告诉当前线程阻止执行,直到另一个线程死亡。

      Thread t = new Thread(myRunnable);
      t.join(); //Wait until t dies
      

      连接有多种变体,会设置最长等待时间

      【讨论】:

      • 我应该补充一下,我只是对 Vakh 的回答发表了评论,但我没有这样做的特权。
      • 迭代任务是一个很好的方法,但是,是否存在一种方法来验证任务是否在排队或正在执行?
      • 将所有线程添加到执行器服务后,您可以通过调用 Thread.getState() 或 Thread.isAlive() 来查询它们,这将为您提供一些有用的信息。假设您知道对线程的引用。
      • 或者直到现在我才想到的东西(这可能更有用),submit(Runnable r) 函数返回一个叫做 Future 的东西,它有一个叫做 isDone() 的函数,它可以告诉你它是否已经完成运行。在这种情况下,您还应该熟悉 Callable 接口。
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2012-04-30
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多