【问题标题】:How to make an ExecutorService create n threads executing exactly same task?如何让 ExecutorService 创建 n 个线程执行完全相同的任务?
【发布时间】:2019-11-20 22:23:57
【问题描述】:

我关注this example

在该示例中,可以创建一个线程池,它将执行 3 个不同的任务。

但是,我只想创建一个由 n 个线程执行的任务。

int numberOfThreads = 2;
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
Runnable task1 = () -> {
  System.out.println("Executing Task1 inside : " + 
  Thread.currentThread().getName());
  try {
    TimeUnit.SECONDS.sleep(2);
  } catch (InterruptedException ex) {
    throw new IllegalStateException(ex);
  }
};
executorService.submit(task1, numberOfThreads); // This is not like this obviously

我怎样才能以适当的方式实现这一目标?

【问题讨论】:

  • 简单提交多次?
  • 多次提交同一个任务,每个任务都在一个单独的线程中

标签: java multithreading threadpool executorservice executor


【解决方案1】:

真的没有魔法。您所要做的就是多次提交相同的任务,如下所示:

public static void main(String args[]) {
    int numberOfThreads = 2;
    ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
    Runnable task1 = () -> {
      System.out.println("Executing Task1 inside : " + 
      Thread.currentThread().getName());
      try {
        TimeUnit.SECONDS.sleep(2);
      } catch (InterruptedException ex) {
        throw new IllegalStateException(ex);
      }
    };
    executorService.submit(task1);
    executorService.submit(task1);
}

【讨论】:

  • 然后确保任务是线程安全的。这个是,因为其中没有可变状态。
  • @Thilo 好吧,我想说所有多线程程序都是如此,不仅适用于这种情况,所以我觉得没有必要在这里添加它。
  • 请注意使用executorService.invokeAll(Collections.nCopies(numberOfThreads, Executors.callable(task1))); 提交任务的numberOfThreads 实例并等待它们一次性完成的可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2021-01-02
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多