【问题标题】:How to stop a thread when its in the wait()如何在等待()中停止线程
【发布时间】:2018-04-25 16:47:11
【问题描述】:
 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 秒并将关闭时间设为 true

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

这是我通知它的部分

我面临的问题是当关闭== true,但是线程卡在wait()区域,当我的关闭时间== true时,如何让线程退出wait()???

【问题讨论】:

  • 我相信中断线程是正确的方法(Thread.interrupt())。
  • 但是线程当前卡在wait()中,在通知线程之前我不能有任何动作...
  • 你需要通知线程。你在哪里调用你发布的最后一个synchronized-block?
  • 第一盒代码在第二盒代码中继续运行,所以当关闭时间不正确时,线程会一直保持wait()直到被notify调用。

标签: java multithreading return wait notify


【解决方案1】:

如果您阅读 Object::wait 文档,它会说:

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

所以你需要中断线程。

【讨论】:

  • 当线程卡在wait()中时如何中断它,因为没有总线继续生成,因此不会有总线进入包含notify()的第4个代码框. – Huat Lee 刚刚编辑
  • 确保另一个线程有你正在运行的线程的实例,并在需要时中断它
【解决方案2】:

a) 您的退出条件(布尔型关闭时间)和锁(同步发生的时间)都应该被等待线程使用。当列表为空且退出条件为 false 时,您的代码可以等待。

b) 您在 2 台显示器上同步; “这个”和“列表”。如果关键区域仅由一个专用监视器保护(可以重用列表),那么添加到列表或更改关闭时间退出条件都可以使用 notify()。这意味着在不中断的情况下将等待的线程踢出,正如它所预期的那样。

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

【讨论】:

    【解决方案3】:

    在您的逻辑中,如果没有公共汽车并且不是关闭时间,您应该等待。但是你只检查第一个条件。我建议在您将closureTime 设置为true 时通知线程。进行以下更改:

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多