日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知)

發布時間:2025/3/12 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.wait()、notify()和notifyAll()

為了更好的支持多線程之間的協作,JDK提供了三個重要的本地方法

//調用某個對象的wait()方法能讓當前線程阻塞,并且當前線程必須擁有此對象的鎖.

public final void wait() throws InterruptedException {

wait(0);

}

//調用某個對象的notify()方法能夠喚醒一個正在等待這個對象的鎖的線程,如果有多個線程都在等待這個對象的鎖,則只能喚醒其中一個線程

public final native void notify();

//notifyAll()方法能夠喚醒所有正在等待這個對象鎖的線程;

public final native void notifyAll();

如圖:當一個擁有Object鎖的線程調用 wait()方法時,就會使當前線程加入object.wait 等待隊列中,并且釋放當前占用的Object鎖,這樣其他線程就有機會獲取這個Object鎖,獲得Object鎖的線程調用notify()方法,就能在Object.wait 等待隊列中隨機喚醒一個線程(該喚醒是隨機的與加入的順序無關,優先級高的被喚醒概率會高),若果調用notifyAll()方法就喚醒全部的線程。注意:調用notify()方法后并不會立即釋放object鎖,會等待該線程執行完畢后釋放Object鎖。

代碼:

public class WaitTest {

private static Object object=new Object();

public static void main(String[] args) {

Thread thread=new Thread(){

@Override

public void run() {

synchronized (object) {

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"進入啟動");

try {

object.wait();//使當前線程進入等待(進入Object.wait隊列)并釋放對象鎖

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"線程執行結束");

}

}

};

thread.start();

Thread thread_2=new Thread(){

@Override

public void run() {

synchronized (object) {

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"進入啟動");

try {

object.notify();//隨機在Object.waitd隊列中喚醒一個正在等待該對象鎖的線程

System.out.println(System.currentTimeMillis()+":"+Thread.currentThread().getName()+"喚醒一個等待的線程");

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

thread_2.start();

}

}

執行結果:

1473306408730:Thread-0進入啟動

1473306408731:Thread-1進入啟動

1473306408731:Thread-1喚醒一個等待的線程

1473306418731:Thread-0線程執行結束

從時間戳中可以看出 Thread-1 在通知Thread-0 繼續執行后,Thread-0 并未立即執行,而是等待Thread-1 釋放Object鎖,在重新獲得Object鎖后,才能繼續執行。(最后兩個時間戳相減剛好是10秒)

總結

以上是生活随笔為你收集整理的线程等待通知 linux,Java 线程协作 wait(等待)与 notiy(通知)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。