您的位置:首页 > 编程语言 > Java开发

一个用Phaser控制多线程协作的小例子

2016-09-19 00:47 239 查看
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);
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程