关于java:wait为什么用while循环不用if

46次阅读

共计 428 个字符,预计需要花费 2 分钟才能阅读完成。

正确代码:

public synchronized String getTask() throws InterruptedException {while (queue.isEmpty()) {this.wait();
        }
        return queue.remove();}

错误代码:

public synchronized String getTask() throws InterruptedException {if (queue.isEmpty()) {this.wait();
    }
    return queue.remove();}

起因:
就是用 if 判断的话,唤醒后线程会从 wait 之后的代码开始运行,然而不会从新判断 if 条件,间接持续运行 if 代码块之后的代码,而如果应用 while 的话,也会从 wait 之后的代码运行,然而唤醒后会从新判断循环条件,如果不成立再执行 while 代码块之后的代码块,成立的话持续 wait。

这也就是为什么用 while 而不必 if 的起因了,因为线程被唤醒后,执行开始的中央是 wait

正文完
 0