CodeMartain 2021-10-03 11:32 采纳率: 76.3%
浏览 26
已结题

为什么会这个样子?需要帮助,急

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

  • 写回答

1条回答 默认 最新

  • 尝鲜我在行 2021-10-05 04:42
    关注

    线程出了问题

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月21日
  • 创建了问题 10月3日

悬赏问题

  • ¥15 铜与钢双金属板叠加在一起每种材料300mm长,18mm宽,4mm厚一端固定并加热至80℃,当加热端温度保持不变时另一端的稳态温度。ansys
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥15 ANSYS分析简单钎焊问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译