java 多執行緒之wait notify詳解

2021-07-27 06:27:28 字數 2326 閱讀 6583

wait 和 notify以及notifyall

notify方法可以隨機喚醒等待佇列中等待同一共享資源的「乙個」執行緒,使其退出等待佇列進入可執行狀態。

測試在呼叫notify方法之後並不會馬上釋放物件鎖,而是在執行完同步方法或同步方法塊的時候才會釋放。

**如下:

public class mylist 

public static int getsize()

}

main方法以及兩個執行緒類如下:

public class test 

}class threada implements runnable

public void run() catch (interruptedexception e) }}

}}class threadb implements runnable

public void run()

system.out.println("增加"+(i+1)+"條資料");}}

try catch (interruptedexception e)

system.out.println("同步方法之外的方法");

}}

列印結果如下:

before wait

增加1條資料

增加2條資料

增加3條資料

增加4條資料

已發出notify通知

增加5條資料

增加6條資料

增加7條資料

增加8條資料

增加9條資料

增加10條資料

after wait

同步方法之外的方法

可以看出2點:

1.執行wait方法後會立馬釋放物件鎖

2.執行notify不會立馬釋放物件鎖,需等該同步方法或同步塊執行完。注意是同步的內容執行完,而不是該執行緒的run方法執行完,從結果最後2句可以看出來。

最後說下 wait和sleep的區別,這也是面試經常面到的問題。

1.sleep是thread類的方法而wait是object類的方法。

2.sleep不會立馬釋放物件鎖,而wait會釋放。

寫個小栗子來證明結論2:

在mylist類中增加乙個方法:

public synchronized void dosth() catch (interruptedexception e) 

system.out.println("thrad name : "+thread.currentthread().getname()+" , end dosth time : "+system.currenttimemillis());

}

測試main方法

mylist mylist = new mylist();

threadc tc = new threadc(mylist);

tc.setname("c");

threadd td = new threadd(mylist);

td.setname("d");

tc.start();

td.start();

threadc和threadd類如下:

class threadc extends thread

@override

public void run()

}class threadd extends thread

@override

public void run()

}

結果如下:

thrad name : c , begain dosth time : 1487647524673

thrad name : c , end dosth time : 1487647527674

thrad name : d , begain dosth time : 1487647527674

thrad name : d , end dosth time : 1487647530674

可以看出執行緒c在呼叫sleep方法後並不會釋放。

最後作點說明:

每個鎖物件都有兩個佇列,就緒佇列以及阻塞佇列。就緒佇列儲存了將要獲得鎖的執行緒,阻塞佇列儲存了被阻塞的執行緒。乙個執行緒被喚醒後,才會進入就緒佇列,以等待cpu排程。反之乙個執行緒被wait後就會進入阻塞佇列,等待下一次喚醒。 也就是說乙個執行緒被wait後會進入阻塞佇列,待呼叫了 notify或notifyall之後,該執行緒就會進入就緒佇列。

JAVA多執行緒之 執行緒池

執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...

Java多執行緒之執行緒安全

當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...

java 多執行緒 之 Excutor

excutor介面 提供了一種將任務提交和任務執行機制相分離的方法 excutorservice介面 提供了excutor的管理介面,以及可為跟蹤乙個或多個非同步任務狀態而生成future的方法 scheduledexcutorservice介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...