package com.thread.gavin.ThreadDemo.company;
import java.util.Random;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
//会议的规则
class MeetingRuler extends Phaser {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
switch (phase) {
case 0:
System.out.println("参加员工代表大会的人都到到齐了----总共到会" + (registeredParties-1) + "人");
System.out.println();
return false;
case 1:
System.out.println("参加中层领导会议的人都到齐了---总共到会" + (registeredParties-1) + "人");
System.out.println();
return false;
case 2:
System.out.println("参加高层领导会议的人都到齐了---总共到会" + registeredParties + "人");
System.out.println();
return false;
case 3:
System.out.println("会议结束,董事长致辞" + registeredParties+"人");
return true;
default:
return true;
}
}
}
/**
* @author Gavin
* @description 会议 10名员工代表(基层领导)5名中层领导,3名高层领导,董事长一人
* 其中员工代表只参加基层会议,---阶段1 18人
* 中/高层领导参加中高层会议,---阶段2 8人
* 高层领导/董事长参加高层会议,---阶段3 4人
* 会议结束---董事长致辞 阶段5----1人
*/
class People implements Runnable {
static MeetingRuler mr = new MeetingRuler();
String name;
String str = "员工代表";
String str1 = "中层领导";
String str2 = "高层领导";
String str3 = "董事长";
void miSleep(int time) {
try {
TimeUnit.SECONDS.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public People(String name) {
this.name = name;
}
/**
* @author Gavin
* @description 参加基层会议
*/
public void joinCommonMeet() {
//会议准备阶段
miSleep(1);
if (!"DS".equals(Thread.currentThread().getName())) {
System.out.printf("%s 参加了员工代表大会 \n", name);
//到这里等待---等所有人完成才能继续下一个
mr.arriveAndAwaitAdvance();
//到齐了,会议进行ing
miSleep(5);
} else {
//董事长视察后就走了,不用等待
mr.arrive();
}
}
/**
* @author Gavin
* @description 参加中层会议
*/
public void joinMidMeet() {
//如果不是员工代表则可以参加中层领导会议
if ("ZC".equals(Thread.currentThread().getName()) || "GC".equals(Thread.currentThread().getName())) {
//会议准备阶段
miSleep(1);
System.out.printf("%s 参加了中层领导会议\n", name);
//领导到这也是等待----所有人都齐了,进行下一个
mr.arriveAndAwaitAdvance();
//到齐了,会议进行ing
miSleep(5);
} else if ("DS".equals(Thread.currentThread().getName())) {
//董事长视察后就走了,不用等待
mr.arrive();
} else {
//员工代表到这里注销掉了
mr.arriveAndDeregister();
}
}
/**
* @author Gavin
* @description 参加高层会议 joinMidMeet之后用按理应该剩下5个中层领导,3个高层领导
*/
public void joinHighMeeting() {
//会议准备阶段
miSleep(3);
if ("GC".equals(Thread.currentThread().getName())||"DS".equals(Thread.currentThread().getName())) {
miSleep(1);
System.out.printf("%s 参加了高层领导会议\n", name);
mr.arriveAndAwaitAdvance();
//到齐了,会议进行ing
miSleep(5);
} else {
//中层领导导致了注销了
mr.arriveAndDeregister();
}
}
public void endMeeting(){
//会议准备阶段
miSleep(3);
if("DS".equals(Thread.currentThread().getName())){
miSleep(1);
System.out.printf("%s 发表大会致辞,会议结束\n", name);
mr.arriveAndAwaitAdvance();
//到齐了,会议进行ing
miSleep(5);
}else{
mr.arriveAndDeregister();
}
}
@Override
public void run() {
joinCommonMeet();
joinMidMeet();
joinHighMeeting();
endMeeting();
}
}
/**
* @author Gavin
*/
public class Meeting {
public static void main(String[] args) {
People.mr.bulkRegister(19);
for (int i = 0; i < 10; i++) {
new Thread(new People("员工代表"+i),"YG").start();
}
for (int i = 0; i < 5; i++) {
new Thread(new People("中层领导"+i),"ZC").start();
}
for (int i = 0; i < 3; i++) {
new Thread(new People("高层领导"+i),"GC").start();
}
new Thread(new People("董事长"),"DS").start();
}
}
错误日志如下
Attempted arrival of unregistered party for com.thread.gavin.ThreadDemo.company.MeetingRule