如何在wait()

时间:2018-04-25 16:47:11

标签: java multithreading return wait notify

 while (!closingTime){ 

        depot.enterramp();
    }

这是为了启动下面的功能

  synchronized (list) {

        while (list.size() == 0) {
            System.out.println(":: DEPOT\t:: " + "NO BUS FOUND IN THE APPROACHES DEPOT, WAITING THE BUS COMING");
            try {
                list.wait();

            } catch (InterruptedException iex) {
                iex.printStackTrace();
            }
        }

目前我的线程正在等待notify()[此代码在enterramp()中]

public class Clock extends Thread {
public void run() {
    try {
        Thread.sleep(15000);
        notifyTime();

    } catch (Exception e) {

    }
}

public synchronized void notifyTime() {
    System.out.println(":: CLOCK\t:: ALERT ALERT !!! DEPOT HAVE TO CLOSE IN 30 MINUTES, NO MORE ACCEPTING THE BUSES");
    closingTime = true;

    return;


}

这是时钟休眠15秒并使结束时间为真

 synchronized (list) {
            list.add(bus);
            list.notify();
        }

这是我通知它的一部分

我遇到的问题是当关闭== true时,但是线程在wait()区域中,我怎么能在我的closingtime == true时让线程退出wait()? / p>

3 个答案:

答案 0 :(得分:0)

如果您阅读Object::wait文档,则会说明以下内容:

  

使当前线程等到另一个线程调用   此对象的notify()方法或notifyAll()方法,或一些   其他线程会中断当前线程或一定数量的线程   实时已经过去了。

所以你需要打断线程。

答案 1 :(得分:0)

a)您的退出条件(boolean closingTime)和锁定(发生同步)应该由等待的线程使用。您的代码可以在列表为空时等待,退出条件为false。

b)您正在2台显示器上进行同步; 'this'和'list'。如果关键区域仅受一个专用监视器保护(重用列表有点可以),则添加到列表或更改closingTime退出条件都可以使用notify()。这意味着在没有中断的情况下将等待线程踢出去,就像打算用于。

c)尽量避免使用notify(),使用notifyAll(),除非你真的知道为什么你只应该通知一个。

答案 2 :(得分:0)

在你的逻辑中你应该等待没有公共汽车并且它没有关闭时间。但你只检查第一个条件。我建议在将closingTime设置为true时通知线程。进行这些更改:

while (list.size() == 0 && !closingTime) {


closingTime = true;
list.notifyAll();

同时在interrupt()主题上:它确实让你退出了wait(),但它的逻辑非常不同。它被用于外部控制,就像停止执行和退出的信号一样。所以,当你想停止等待时,使用notyfyAll(),当你想要BREAK执行时,使用interrupt()。