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>
答案 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()。