public static void main(String[] args)
{
MyPhaser phaser = new MyPhaser();
StudentTask[] tasks = new StudentTask[5];
for (int i = 0; i < tasks.length; i++) {
tasks = new StudentTask(phaser);
phaser.register(); //注册一次表示phaser维护的线程个数
}
Thread[] threads = new Thread[tasks.length];
for (int i = 0; i < tasks.length; i++) {
threads = new Thread(tasks, "Student "+i);
threads.start();
}
//等待所有线程执行结束
for (int i = 0; i < tasks.length; i++) {
try {
threads.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Phaser has finished:"+phaser.isTerminated());
}
}
class StudentTask implements Runnable{
private Phaser phaser;
public StudentTask(Phaser phaser) {
this.phaser = phaser;
}
Random random = new Random();
@Override
public void run()
{
System.out.println(Thread.currentThread().getName()+"已做好准备");
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName()+"开始做第1题");
int time1 = doExercise1();
System.out.println(Thread.currentThread().getName()+"完成第1题,做题时间:" + time1);
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName()+"开始做第2题");
int time2 = doExercise2();
System.out.println(Thread.currentThread().getName()+"完成第2题,做题时间:" + time2);
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName()+"开始做第3题");
int time3 = doExercise3();
System.out.println(Thread.currentThread().getName()+"完成第3题,做题时间:" + time3);
phaser.arriveAndAwaitAdvance();
}
private int doExercise1() {
int time1 = random.nextInt(100);
try {
TimeUnit.SECONDS.sleep(time1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return time1;
}
private int doExercise2() {
int time2 = random.nextInt(100);
try {
TimeUnit.SECONDS.sleep(time2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return time2;
}
private int doExercise3() {
int time3 = random.nextInt(100);
try {
TimeUnit.SECONDS.sleep(time3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return time3;
}
}
class MyPhaser extends Phaser{
@Override
protected boolean onAdvance(int phase, int registeredParties)
{
switch(phase) {
case 0:
return studentArrived();
case 1:
return finishFirstExercise();
case 2:
return finishSecondExercise();
case 3:
return finishExam();
default:
return true;
}
}