假设自习室有30个座位,50个学生需先预定才能在自习室上自习。当自习室座位全部被预定后,其余学生需要等待。当学生完成自习任务后,需取消预定的座位,以便其他等待的学生能够预定。import java.util.concurrent.*; public class Exp5 { public static void main(String[] args) throws Exception { BlockingQueue<Seat> seats = new ArrayBlockingQueue<>(30); Student[] students = new Student[50]; for (int i = 0; i < students.length; i++) { students[i] = new Student(seats, i + 1); } for (int i = 0; i < students.length; i++) { students[i].start(); } } } class Seat { } class Student extends Thread { BlockingQueue<Seat> seats; Seat seat; int studentNum; Student(BlockingQueue<Seat> seats, int studentNum) throws Exception { this.seats = seats; seat = new Seat(); this.studentNum = studentNum; } @Override public void run() { // fill here } void orderSeat() throws Exception { // fill here } void unorderSeat() throws Exception { // fill here } }补充这个程序
时间: 2024-02-14 15:10:57 浏览: 103
这个程序的主要功能是实现学生在自习室中预定、取消预定座位的过程。下面是补充的程序:
```java
import java.util.concurrent.*;
public class Exp5 {
public static void main(String[] args) throws Exception {
BlockingQueue<Seat> seats = new ArrayBlockingQueue<>(30);
Student[] students = new Student[50];
for (int i = 0; i < students.length; i++) {
students[i] = new Student(seats, i + 1);
}
for (int i = 0; i < students.length; i++) {
students[i].start();
}
}
}
class Seat { }
class Student extends Thread {
BlockingQueue<Seat> seats;
Seat seat;
int studentNum;
Student(BlockingQueue<Seat> seats, int studentNum) throws Exception {
this.seats = seats;
seat = new Seat();
this.studentNum = studentNum;
}
@Override
public void run() {
try {
orderSeat();
Thread.sleep(5000); // 学生在自习室上自习的时间
unorderSeat();
} catch (Exception e) {
e.printStackTrace();
}
}
void orderSeat() throws Exception {
System.out.println("学生" + studentNum + "开始预定座位");
seats.put(seat);
System.out.println("学生" + studentNum + "预定了座位");
}
void unorderSeat() throws Exception {
System.out.println("学生" + studentNum + "开始取消预定座位");
seats.take(); // 从队列中移除座位
System.out.println("学生" + studentNum + "取消了预定座位");
}
}
```
程序中使用了BlockingQueue来模拟自习室的座位,BlockingQueue是一个阻塞队列,可以实现线程安全的操作。在程序中,当学生需要预定座位时,调用BlockingQueue的put方法将座位加入队列;当学生取消预定座位时,调用BlockingQueue的take方法将座位从队列中移除。
程序中的Student类继承了Thread类,表示一个学生,每个学生都有一个座位Seat和一个学号studentNum。在run方法中,学生先预定座位,然后休眠一段时间,最后取消预定座位。
程序的输出结果类似于以下内容:
```
学生1开始预定座位
学生1预定了座位
学生2开始预定座位
学生2预定了座位
学生3开始预定座位
学生3预定了座位
学生4开始预定座位
学生5开始预定座位
学生2取消了预定座位
学生3取消了预定座位
学生4预定了座位
学生5预定了座位
学生1开始取消预定座位
学生4取消了预定座位
学生5取消了预定座位
学生1取消了预定座位
```
可以看到,学生按顺序预定座位,当座位已经全部被预定时,其余学生需要等待;当有学生完成自习任务并取消预定座位时,等待的学生可以继续预定座位。
阅读全文