Java中的notify和notifyAll方法是用于線程同步的重要方法,主要用于線程之間的通信。在講解這兩個方法前,我們先了解一下Java中的線程。
Java中的線程是輕量級的進(jìn)程,它可以并發(fā)地執(zhí)行多個任務(wù),同時也可以在單個任務(wù)中進(jìn)行多個交曲式的活動。通常情況下,線程之間可能會需要相互通信,這時就需要利用notify和notifyAll方法。
/** * 線程A類 */ class ThreadA extends Thread{ private final Object lock; public ThreadA(Object lock){ this.lock = lock; } @Override public void run() { synchronized (lock){ System.out.println("ThreadA start"); try { System.out.println("ThreadA wait"); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ThreadA end"); } } } /** * 線程B類 */ class ThreadB extends Thread{ private final Object lock; public ThreadB(Object lock){ this.lock = lock; } @Override public void run() { synchronized (lock){ System.out.println("ThreadB start"); lock.notify(); //使用notify方法 System.out.println("ThreadB end"); } } }
上述代碼展示了線程之間如何進(jìn)行通信。其中,線程A在synchronized塊中通過調(diào)用lock.wait方法,使當(dāng)前線程等待,并釋放鎖。線程B在synchronized塊中通過調(diào)用lock.notify方法,喚醒在此對象監(jiān)視器上等待的單個線程(即線程A),使其從wait方法返回。
在調(diào)用notify方法后,線程B不會立刻釋放鎖,只有等到synchronized塊執(zhí)行結(jié)束,線程B才會釋放鎖。如果需要同時喚醒所有在此對象監(jiān)視器上等待的線程,可以使用notifyAll方法,代碼如下:
/** * 線程C類 */ class ThreadC extends Thread{ private final Object lock; public ThreadC(Object lock){ this.lock = lock; } @Override public void run() { synchronized (lock){ System.out.println("ThreadC start"); lock.notifyAll(); //使用notifyAll方法 System.out.println("ThreadC end"); } } }
總的來說,Java中的notify和notifyAll方法是用于線程間通信的重要方法。調(diào)用這兩個方法將會喚醒在此對象監(jiān)視器上等待的線程,從而實(shí)現(xiàn)線程的同步。