線程是Java語言中用于實現(xiàn)多任務(wù)的一種機制。多個線程可以同時執(zhí)行不同的任務(wù),提高程序的并發(fā)性和效率。在多線程編程中,線程的同步與通信是非常重要的概念。Java提供了wait和notify方法來實現(xiàn)線程之間的同步與通信。
線程的同步與通信
線程的同步是指多個線程按照一定的先后順序執(zhí)行指定的任務(wù),避免出現(xiàn)競爭條件和數(shù)據(jù)不一致的問題。線程的通信是指多個線程之間傳遞消息、共享數(shù)據(jù)和協(xié)同工作,實現(xiàn)任務(wù)的分工和協(xié)調(diào)。
wait方法
wait方法是Object類中的方法,它的作用是使當前線程等待,直到其他線程調(diào)用notify或notifyAll方法喚醒它。wait方法需要在同步代碼塊或同步方法中調(diào)用,否則會拋出IllegalMonitorStateException異常。調(diào)用wait方法后,當前線程將釋放鎖,進入等待狀態(tài),直到被其他線程喚醒。
notify方法
notify方法是Object類中的方法,它的作用是喚醒正在等待的線程中的一個線程。notify方法需要在同步代碼塊或同步方法中調(diào)用,否則會拋出IllegalMonitorStateException異常。調(diào)用notify方法后,將從等待狀態(tài)的線程中隨機選擇一個線程喚醒,被喚醒的線程將進入就緒狀態(tài),然后參與線程的競爭。
notifyAll方法
notifyAll方法是Object類中的方法,它的作用是喚醒正在等待的所有線程。notifyAll方法需要在同步代碼塊或同步方法中調(diào)用,否則會拋出IllegalMonitorStateException異常。調(diào)用notifyAll方法后,所有等待狀態(tài)的線程都會被喚醒,并且參與線程的競爭,其中只有一個線程能夠獲得鎖。
線程的等待與喚醒實例
下面是一個使用wait和notify方法實現(xiàn)線程等待與喚醒的示例:
class MyThread implements Runnable {
public synchronized void run() {
try {
System.out.println("線程開始等待:" + Thread.currentThread().getName());
wait();
System.out.println("線程被喚醒:" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread);
Thread thread2 = new Thread(myThread);
thread1.start();
thread2.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (myThread) {
myThread.notify();
}
}
}以上代碼創(chuàng)建了兩個線程,線程運行時先調(diào)用wait方法,然后通過主線程調(diào)用notify方法喚醒一個線程,被喚醒的線程將繼續(xù)執(zhí)行。運行結(jié)果會先輸出"線程開始等待",然后等待2秒后輸出"線程被喚醒"。
總結(jié)
Java中的wait和notify方法是實現(xiàn)線程同步與通信的重要手段。wait方法使線程等待并釋放鎖,notify方法喚醒等待中的線程。通過合理使用wait和notify方法,可以實現(xiàn)線程之間的協(xié)作,提高程序的并發(fā)性和效率。