正确代码:
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