gpt4 book ai didi

java - 线程在 notifyAll() 之后没有唤醒;

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

好的,所以我有这些扩展 Thread 的类,我应该做的是:

  1. 让所有校友都到齐。
  2. 当校友到达时,他们会打招呼。
  3. 如果老师来了但不是所有校友都来了,那么他应该 wait() 等他们。
  4. 校友到齐后应通知()老师。

一个 alumn 是一个用 boolean 值 0 初始化的线程。

老师是一个用 boolean 值 1 初始化的线程。

人员/问候代码

    public class Person extends Thread {
private Thread t;
private String threadName;
boolean id;
Greeting greeting;
public Person(String name,boolean tipo,int n){
this.threadName = name;
this.id=tipo;
greeting =new Greeting();
}

@Override
public void run() {
if(id==false) {
try {
greeting.alumn(threadName);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
else{
try {
greeting.teacher(threadName);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public void start()
{
System.out.println("Starting "+ threadName);
if(t==null)
{
t=new Thread(this,threadName);
t.start();
}
}
}

class Greeting {

public void alumn(String s) throws InterruptedException{
System.out.println(s);
synchronized (this){
System.out.println("Alumn: "+s);
notifyAll();
}
}

public synchronized void teacher(String s) throws InterruptedException {
wait();
System.out.println(s);
}
}

主类

public class ClassRoom {
public static void main(String [] args) {

Person francisco = new Person("Francisco",false,1);
Person jesus = new Person("Jesus", false,2);
Person alberto = new Person("Alberto",false,3);
Person karla = new Person("Karla",false,4);
Person maestro = new Person("Professor",true,0);
francisco.start();
jesus.start();
alberto.start();
karla.start();
maestro.start();
}
}

问题:如果老师先到,他就去等待()...然后校友到了,但他永远不会醒来。老师不先到,他还醒不过来呢!如何解决这个问题?

最佳答案

If the teacher arrives first he goes to wait()...then alumns arrive but he never wakes up.

你们所有人都实例化了他们自己的问候语,它在 this 上同步,因此也在 this 上等待/通知。每个人都使用自己的信号量,这不是您想要的。您应该为所有实例同步同一个对象(可能是 Greeting.class)。

If the teacher doesn't arrive first, he still never wakes up! How to fix this?

只需检查是否所有校友都在那里。如果是问候,否则等待通知。之后再检查。检查必须是同步块(synchronized block)的一部分,以避免竞争条件。

关于java - 线程在 notifyAll() 之后没有唤醒;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827114/

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