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