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

正确代码:

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理