Java 如何分阶段执行所有线程

Java 如何分阶段执行所有线程,java,multithreading,Java,Multithreading,如果每个任务(线程)有多个阶段。然后,如何确保所有任务执行阶段1,然后执行阶段2,依此类推。例如,如何修改以下代码以使我的输出为: 任务1的第1阶段, 任务2的第1阶段, 任务3的第1阶段, 任务1的第2阶段, 任务2的第2阶段, 任务3的第2阶段, 等等 public class Task implements Runnable{ public String name; static Random random = new Random(); Task(String

如果每个任务(线程)有多个阶段。然后,如何确保所有任务执行阶段1,然后执行阶段2,依此类推。例如,如何修改以下代码以使我的输出为: 任务1的第1阶段, 任务2的第1阶段, 任务3的第1阶段, 任务1的第2阶段, 任务2的第2阶段, 任务3的第2阶段, 等等

public class Task implements Runnable{
    public String name;
    static Random random = new Random();

    Task(String name){
        this.name=name;
    }

    public static void main(String args[]) {
        ExecutorService ex = Executors.newFixedThreadPool(6);
        ex.submit(new Task("Task 1"));
        ex.submit(new Task("Task 2"));
        ex.submit(new Task("Task 3"));
    }

    public static void getRandomsleep() {
         try {
                Thread.sleep(random.nextInt(5000));
            } catch (InterruptedException e) {
                // ...
            }   }

    public void run() {
        System.out.println("thread name" + this.name);
        getRandomsleep();
        System.out.println("stage 1 of " + this.name);
        getRandomsleep();
        System.out.println("stage 2 of " + this.name);
        getRandomsleep();

    }
}

您可以使用
CyclicBarrier
来解决此类问题

public class CyclicBarrierDemo {

  public static void main(String args[]) {
    CyclicBarrier barrier = new CyclicBarrier(3);
    ExecutorService ex = Executors.newFixedThreadPool(3);
    ex.submit(new Task("Task 1", barrier));
    ex.submit(new Task("Task 2", barrier));
    ex.submit(new Task("Task 3", barrier));
  }

  static class Task implements Runnable {
    String name;
    CyclicBarrier barrier;

    Task(String name, CyclicBarrier barrier) {
      this.name = name;
      this.barrier = barrier;
    }

    void doWork() {
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        // ...
      }
    }

    public void run() {
      for (int i = 1; i <= 3; i++) {
        System.out.println("stage " + i + " of " + this.name);
        doWork();
        try {
          barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
          return;
        }
      }
    }
  }
}
stage 1 of Task 1
stage 1 of Task 2
stage 1 of Task 3
stage 2 of Task 1
stage 2 of Task 2
stage 2 of Task 3
stage 3 of Task 3
stage 3 of Task 1
stage 3 of Task 2