package com.zl1030.Phaser;
import java.util.concurrent.Phaser;
public class Bot implements Runnable {
private Phaser phaser;
private int id;
public Bot(int id, Phaser phaser) {
super();
this.id = id;
this.phaser = phaser;
}
public void run() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("id:" + id + " wait...");
Thread.sleep((long) (Math.random() * 5000));
System.out.println("id:" + id + " arrive phase: " + phaser.getPhase());
phaser.arriveAndAwaitAdvance();
System.out.println("id:" + id + " after wait");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.zl1030.Phaser;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Phaser;
public class Test {
public static void main(String... args) throws Exception {
Phaser phaser = new Phaser() {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
System.out.println("=====================phase:" + phase + " arrived!============================");
return false;
}
};
int botNum = 3;
phaser.bulkRegister(botNum + 1);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < botNum; i++) {
executorService.execute(new Bot(i + 1, phaser));
}
Scanner s = new Scanner(System.in);
System.out.println("请输入字符串:");
while (true) {
String line = s.nextLine();
if (line.equals("exit")) {
System.out.println("Bye!");
System.exit(0);
} else {
switch (line) {
case "add":
phaser.bulkRegister(1);
botNum += 1;
executorService.execute(new Bot(botNum, phaser));
break;
case "state":
System.out.println("phase: " + phaser.getPhase() + " arrivedParties:" + phaser.getArrivedParties()
+ "/" + botNum);
break;
case "continue":
phaser.arriveAndAwaitAdvance();
break;
}
System.out.println(">>>" + line);
}
}
}
}
转载于:https://blog.51cto.com/zl1030/1853846