java - 无法唤醒线程

标签 java multithreading wait notify

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

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

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

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

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

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/

相关文章:

java - 如何为列表中的每个项目添加 TextView ?

c# - 未完成时终止异步委托(delegate)线程

c++ - 使用 OpenMP 实现的线程池

java - 关于多线程java应用程序的时序图

java - 该等待/通知代码性能异常

android - 如何让TabActivity中的MapActivity等待服务端获取Overlay数据?

c# - 你能多次调用一个任务的 Wait() 吗?

java - 如何在没有多个包装类的情况下反序列化 XML?

java - Selenium ChromeDriver : increasing time of getting WebElement Text

java - 检测隐藏的 java bean 属性