import java.util.LinkedList;
public class HospitalQueue {
private final int MAX_CAPACITY = 10; // 医院队列最大容量
private LinkedList<Patient> queue; // 医院队列
public HospitalQueue() {
this.queue = new LinkedList<Patient>();
}
public synchronized void addPatient(Patient patient) {
while (queue.size() >= MAX_CAPACITY) {
try {
wait(); // 如果队列已满,等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.add(patient);
System.out.println(patient.getName() + "进入医院排队");
notifyAll(); // 通知其他线程可以继续添加患者
}
public synchronized Patient getNextPatient() {
while (queue.isEmpty()) {
try {
wait(); // 如果队列为空,等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Patient patient = queue.remove();
System.out.println(patient.getName() + "开始治疗");
notifyAll(); // 通知其他线程可以继续添加患者
return patient;
}
}
public class Patient {
private String name;
public Patient(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Hospital {
private HospitalQueue queue;
public Hospital(HospitalQueue queue) {
this.queue = queue;
}
public void addPatient(Patient patient) {
queue.addPatient(patient);
}
public void startTreat() {
while (true) {
Patient patient = queue.getNextPatient();
try {
Thread.sleep(5000); // 模拟治疗过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
HospitalQueue queue = new HospitalQueue();
Hospital hospital = new Hospital(queue);
Thread t1 = new Thread(new Runnable() {
public void run() {
hospital.addPatient(new Patient("张三"));
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
hospital.addPatient(new Patient("李四"));
}
});
Thread t3 = new Thread(new Runnable() {
public void run() {
hospital.startTreat();
}
});
t1.start();
t2.start();
t3.start();
}
}
这个例子中,医院排队系统包含三个类:HospitalQueue
、Patient
、Hospital
。
HospitalQueue
类维护一个队列,提供添加患者和获取下一个患者的方法。如果队列已满或为空,线程需要等待。Patient
类表示一个患者。Hospital
类是一个医院,包含一个排队系统,提供添加患者和治疗的方法。
在Main
类中,我们创建了一个医院队列和一个医院,然后创建三个线程:一个线程用于添加患者到队列中,另一个线程也用于添加患者到队列中,第三个线程用于治疗患者。当患者被添加到队列中时,HospitalQueue
类中的添加方法会被调用,如果队列已满,线程会等待。当患者被治疗时,HospitalQueue
类中的获取下一个患者的方法会被调用,如果队列为空,线程会等待。
这个例子中使用了synchronized
关键字和wait()
、notifyAll()
方法来实现线程同步。synchronized
关键字用于保证线程安全,wait()
方法用于让线程等待,notifyAll()
方法用于唤醒等待的线程。