這兩個和sleep同樣,不釋放持有的鎖。java
public class WaitDemo { private String tv = "廣告"; static class Tv extends Thread { WaitDemo waitDemo; public Tv(WaitDemo waitDemo) { this.waitDemo = waitDemo; } @Override public void run() { waitDemo.waitTv(); } } public synchronized void waitTv() { while (tv.equals("廣告")) { try { wait(); if (tv.equals("廣告")) { System.out.println(Thread.currentThread().getName() + "-" + "騙人,仍是廣告"); } } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + "-" +"愉快的追劇"); } public synchronized void sendTrueMsg() { tv = "正劇"; notifyAll(); } public synchronized void sendFalseMsg() { notifyAll(); } public static void main(String[] args) throws InterruptedException { WaitDemo waitDemo = new WaitDemo(); Tv tv1 = new Tv(waitDemo); Tv tv2 = new Tv(waitDemo); tv1.start(); tv2.start(); Thread.sleep(100); waitDemo.sendFalseMsg(); Thread.sleep(100); waitDemo.sendTrueMsg(); } }
運行的結果以下:
例子:大部分人喜歡看連續劇,可是不看廣告(沒錢買VIP),因而就讓別人提醒她廣告結束了沒有,若是結束了,就提醒她。
用法:多線程
while會一直循環,直到條件知足。若是是if,只會判斷一次,若是不知足條件,會一直等待ide
能夠把上面的例子,改爲notify,那麼進程永遠不會結束,由於在多線程狀況下,notify只能喚醒隨機的一個休眠線程,其餘已休眠的線程不能喚醒,形成信號不能傳達而丟失,而notifyAll能夠喚醒全部的。this