自习室有30个座位,50个学生需先预订才能在自习室上自习。 当自习室的座位被全部预订后,其余学生需要等待。当学生完成学习任务后,需要取消预订的座位,以便其他等待的学生能够预订

public class SeatorderedCase {
    private int seatResource;     //共享缓冲区
    private boolean empty=true;    //是否为空的信号量

    public void setEmpty(){
        empty=true;
    }

    public synchronized void push(int pubResource){
        while (!empty){                       //当缓冲区满的时候等待
            try {                             //阻塞自己
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        seatResource = pubResource;        //将生成的座位号放到缓冲区中
        empty = false;
        notify();            //唤醒其他等待的线程
    }

    public synchronized int pop(){       //从缓冲区中定座位
        while (empty){
            try {
                wait();                  //当缓冲区为空的时候等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        int popResource = seatResource;
        seatResource = 0;
        empty = true;                  //设置缓冲区为空的状态
        notify();
        return popResource;            //返回所定的座位号
    }

    //生成空座位线程(生产者)
    static class SeatProcedure extends Thread{
        private SeatorderedCase so;
        public SeatProcedure(SeatorderedCase so){
            this.so = so;
        }

        public void run() {
            for (int i = 0; i <= 30 ; i++) {    //连续向缓冲区中生成空座位号
                int pubResource = i;
                so.push(pubResource);
                System.out.println("第"+pubResource+"号座位为空");
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //预订座位线程(消费者)
    static class SeatConsumer extends Thread{
        private SeatorderedCase so;
        public SeatConsumer(SeatorderedCase so){
            this.so = so;
        }

        public void run() {
            for (int i = 1; i <= 50 ; i++) {       //生成50个学生,50个学生连续从缓冲区中取出座位号
                synchronized (so){
                    int sh = so.pop();
                    if (sh != 0){
                        System.out.println("学生"+ i +"占了第" + sh +"号座位");
                    } else {
                        System.out.println("没有空座位,请等待");
                    }
                }
                try {
                    sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //释放座位线程
    static class SeatRelease extends Thread{
        private SeatorderedCase so;
        public SeatRelease(SeatorderedCase so){
            this.so = so;
        }

        public void run() {
            try {
                sleep(20000);
                this.so.setEmpty();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 1; i <= 30; i++) {         //从第一个开始,连续释放已预订的座位
                int pubResource = i;
                so.push(pubResource);
                System.out.println("第"+pubResource+"号座位取消预订");
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        SeatorderedCase so = new SeatorderedCase();

        SeatProcedure sp = new SeatProcedure(so);
        sp.start();

        SeatConsumer sc = new SeatConsumer(so);
        sc.start();

        SeatRelease sr = new SeatRelease(so);
        sr.start();
    }
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,根据您的求,我可以提供以下Java程序来实现自习座位预定和取消预定的功能: ```java import java.util.Scanner; public class StudyRoomBooking { // 定义一个布尔类型的数组,表示自习座位是否被预定 private static boolean[] seats = new boolean[30]; public static void main(String[] args) { Scanner input = new Scanner(System.in); while (true) { // 显示自习座位情况 System.out.println("当前自习座位情况:"); for (int i = 0; i < seats.length; i++) { if (seats[i]) { System.out.print("[ " + (i + 1) + "号座位:已预订 ] "); } else { System.out.print("[ " + (i + 1) + "号座位:可预订 ] "); } } System.out.println(); // 判断是否有座位可以预定 boolean isAvailable = false; for (int i = 0; i < seats.length; i++) { if (!seats[i]) { isAvailable = true; break; } } // 如果没有座位可以预定,则提示等待 if (!isAvailable) { System.out.println("自习座位已全部被预定,请等待..."); continue; } // 提示学生输入座位号 System.out.print("请输入您要预定的座位号:"); int seatNo = input.nextInt(); // 判断座位号是否合法 if (seatNo < 1 || seatNo > 30) { System.out.println("座位号不合法,请重新输入!"); continue; } // 判断座位是否已被预定 if (seats[seatNo - 1]) { System.out.println("该座位已被预定,请重新选择!"); continue; } // 预定座位并提示预定成功 seats[seatNo - 1] = true; System.out.println("恭喜您,预定成功!"); // 提示学生是否取消预定 System.out.print("是否取消预定?(Y/N)"); String choice = input.next(); // 如果选择取消预定,则取消预定座位 if (choice.equalsIgnoreCase("Y")) { seats[seatNo - 1] = false; System.out.println("您已成功取消预定!"); } } } } ``` 这个程序中,我们定义了一个长度为30的布尔类型数组seats,表示自习座位是否被预定。当一个学生选择预定座位时,程序会检查该座位是否已被预定,如果没有则将该座位标记为已预定,并提示预定成功;如果该座位已被预定,则提示学生重新选择座位。当一个学生完成自习任务后,可以选择取消预定座位,以便其他等待学生能够预定。程序会不断循环,直到所有座位都被预定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值