gpt4 book ai didi

java - 无法唤醒线程

转载 作者:太空宇宙 更新时间:2023-11-04 13:54:08 26 4
gpt4 key购买 nike

我在唤醒线程时遇到问题。

在我的程序中,必须有一个名为“巴士”的移动线程和几个试图进入巴士去其他地方的登山者。

巴士必须始终处于移动状态(等待登山者进出时除外),登山者必须查看巴士是否在正确的位置,以便他们可以进出。

所以我编写了这段代码,但我无法让它工作,似乎总线无法唤醒线程,但我无法想出另一个解决方案,我不知道出了什么问题。

如何示意登山者起床并上车?

public class Bus extends Thread
{
boolean pointA=true, pointB=false;

public Bus() {
start();
}

@Override
public void run()
{
while(true)
{
waiting();
goA();
waiting();
goB();
}
}

public synchronized void waiting() {
try {
Thread.sleep((int)(1000)); //waiting for the climbers
} catch (InterruptedException ex) {}
}

public synchronized void goB() {
pointA = false;
try {
Thread.sleep((int)(1000)); //travelling
} catch (InterruptedException ex) {}
pointB = true;
notifyAll(); //is in B, the climbers can get out
}

public synchronized void goA() {
pointB = false;
try {
Thread.sleep((int)(1000));
} catch (InterruptedException ex) {}
pointA = true;
notifyAll(); //is in A, the climbers can get in
}

public synchronized void enter(Climber c, ArrayThreads fA, ArrayThreads fBus){

while(!pointA){ //wait until Bus reaches pointA
try{wait();}catch(InterruptedException e){}
}
fA.out(c); //Leaves station
fBus.put(c); //Enters the bus

while(!pointB){ //wait until Bus reaches pointB
try{wait();}catch(InterruptedException e){}
}

fBus.out(c); //Leaves Bus

}

}

最佳答案

您提供的代码包含重写的等待方法。但在Object类中wait方法是final的。所以人们无法覆盖它。

不,代码中的问题是,您正在从同一线程调用 wait 和 notificationall 方法。

在给定的代码中,您调用同步方法 wait() 并期望其他同步方法 goA() 会通知,但该方法永远不会被调用。由于 wait 方法正在持有锁。

因此,修改具有两个线程的程序,一个用于公共(public)汽车,一个用于创建登山者可能会有所帮助

关于java - 无法唤醒线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012931/

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