gpt4 book ai didi

Java - 使用同步方法进行多线程练习

转载 作者:行者123 更新时间:2023-11-30 04:10:18 25 4
gpt4 key购买 nike

我有这个练习,一种医院模拟,其中我必须控制每个房间的访问。医生一次只能进入一个房间,并且只有在没有访客进入的情况下才能进入。相反,访客只能在没有医生在场且最多还有 4 名访客进入的情况下才能进入该房间。这是我的代码:

public class Room {

public Room(){
}

public synchronized void friendVisit() throws InterruptedException{
if(visitors>4 || doctors>0)
wait();
visitors++;
}

public synchronized void exitFriend(){
visitors--;
notify();
}

public synchronized void doctorVisit() throws InterruptedException{
if(doctors>0 || visitors>0)
wait();
doctors++;
}

public synchronized void exitDoctor(){
--doctors;
notify();
}

public int getVisitors(){
return visitors;
}

public int getDoctors(){
return doctors;
}

int visitors=0; //number of visitors in the room
int doctors=0; //number of doctors in the room

医生和访客(称为 Friend 的类)是线程

public class Friend extends Thread{
public Friend(Room room_reference){
room=room_reference;
}

public void run(){
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
room.friendVisit();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
room.exitFriend();
}

private Room room; //reference to the room

这是医生线程:

public class Doctor extends Thread{
public Doctor(Room room_reference){
room=room_reference;
}

public void run(){
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
room.doctorVisit();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
room.exitDoctor();
}

private Room room; //reference to the room

这是一个显示线程,用于跟踪访客和医生的数量:

public class Display extends Thread{
public Display(Room room_reference){
room=room_reference;
}

public void run(){
while(true)
{
try {
sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("The room contains "+room.getDoctors()+
" doctors and "+room.getVisitors()+" visitors.");
}
}

private Room room;

这是我的主要内容:

public class Demo {
public static void main(String[]args){
Room room=new Room();
Friend friend=new Friend(room);
Doctor doctor=new Doctor(room);
Display display=new Display(room);
display.start();
while(true){
if(new Random().nextBoolean()==true){
friend=new Friend(room);
friend.start();
}
if(new Random().nextInt(5)==3){
doctor=new Doctor(room);
doctor.start();
}
}
}

问题是不止一名医生可以访问该房间,我不明白为什么,因为 Room 类中的方法适用于访客。提前致谢。

最佳答案

我认为您的错误之一是假设 wait() 仅当满足上面的条件时才会返回:

if(doctors>0 || visitors>0)
wait();

您可以在 if 语句中的条件为 false 的情况下从此调用返回 wait()。也许尝试一下 while 循环:

while (doctors>0 || visitors>0) {
wait();
}

(当然要添加括号,因为你知道缺少括号是邪恶的......)

可能还有其他问题 - 我还没有启动您的代码。

关于Java - 使用同步方法进行多线程练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com