当前位置: 首页 > 后端技术 > Java

为什么wait使用while循环而不是if

时间:2023-04-01 20:43:47 Java

正确代码:publicsynchronizedStringgetTask()throwsInterruptedException{while(queue.isEmpty()){this.wait();}returnqueue.remove();}错误代码:publicsynchronizedStringgetTask()throwsInterruptedException{if(queue.isEmpty()){this.wait();}returnqueue.remove();}原因:如果通过if判断,线程会从wait后的代码中唤醒开始运行,但不会重新判断if条件,继续运行if代码块之后的代码直接,如果用while,它也会从wait后的代码开始运行,但是唤醒后会重新判断循环条件,如果不成立则执行while代码块之后的代码块,if成立,继续等待。这就是为什么要用while而不是if,因为线程被唤醒后,开始执行的地方就是wait