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