Java object wait notify notifyAll代碼解析
測試代碼:
public static Object loc=new Object();
public static void main(String[] args) throws Exception{
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
try {
java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
System.out.println("["+sdf.format(new Date())+"] t1___等待鎖...");
synchronized (loc) {
System.out.println("["+sdf.format(new Date())+"] t1___獲得鎖 ...");
Thread.sleep(5000);
System.out.println("["+sdf.format(new Date())+"] t1___loc..開始執(zhí)行wait...");
loc.wait();
System.out.println("["+sdf.format(new Date())+"] t1___loc..執(zhí)行wait后續(xù)...");
Thread.sleep(1000);
}
System.out.println("["+sdf.format(new Date())+"] t1___loc..離開鎖...");
}catch (Exception e){
e.printStackTrace();
}
}
});
Thread t3=new Thread(new Runnable() {
@Override
public void run() {
try {
java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
System.out.println("["+sdf.format(new Date())+"] t3___等待鎖...");
synchronized (loc) {
System.out.println("["+sdf.format(new Date())+"] t3___進入鎖...");
Thread.sleep(5000);
System.out.println("["+sdf.format(new Date())+"] t3___loc..開始 wait...");
loc.wait();
System.out.println("["+sdf.format(new Date())+"] t3___loc..執(zhí)行 wait后續(xù)...");
Thread.sleep(1000);
}
System.out.println("["+sdf.format(new Date())+"] t3___離開鎖...");
}catch (Exception e){
e.printStackTrace();
}
}
});
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
try {
java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
System.out.println("["+sdf.format(new Date())+"] t2___等待鎖...");
synchronized (loc) {
System.out.println("["+sdf.format(new Date())+"] t2___獲得鎖...");
Thread.sleep(5000);
System.out.println("["+sdf.format(new Date())+"] t2___loc..開始執(zhí)行 notify...");
loc.notify();
System.out.println("["+sdf.format(new Date())+"] t2___loc..執(zhí)行 notify后續(xù)...");
Thread.sleep(1000);
}
System.out.println("["+sdf.format(new Date())+"] t2___loc 離開鎖....");
}catch (Exception e){
e.printStackTrace();
}
}
});
t1.start();
t3.start();
Thread.sleep(500);
t2.start();
System.out.println("t1___before join ....");
t1.join();
System.out.println("t2___before join ....");
t2.join();
System.out.println("t3____before join ....");
t3.join();
System.out.println("main exit....");
}
執(zhí)行結(jié)果:
[16:55:59 384] t1___等待鎖...
[16:55:59 384] t1___獲得鎖 ...
[16:55:59 384] t3___等待鎖...
t1___before join ....
[16:55:59 836] t2___等待鎖...
[16:56:04 392] t1___loc..開始執(zhí)行wait...[16:56:04 392] t2___獲得鎖...
[16:56:09 392] t2___loc..開始執(zhí)行 notify...
[16:56:09 392] t2___loc..執(zhí)行 notify后續(xù)...
[16:56:10 392] t2___loc 離開鎖....
[16:56:10 392] t3___進入鎖...
[16:56:15 392] t3___loc..開始 wait...
[16:56:15 392] t1___loc..執(zhí)行wait后續(xù)...
[16:56:16 392] t1___loc..離開鎖...
t2___before join ....
t3____before join ....
總結(jié):
1. 執(zhí)行wait后‘'暫時‘ 釋放當前對象鎖給其他線程,當前線程處于等待狀態(tài)
2. syn塊中的wait收到notify通知后 喚醒cpu 繼續(xù)判斷鎖狀態(tài)
3. 執(zhí)行notify且當前的對象鎖釋放后 wait等待的線程激活
4. notifyAll 是一次喚醒所有的wait
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC之AbstractAnnotationConfigDispatcherSer解讀
這篇文章主要介紹了SpringMVC之AbstractAnnotationConfigDispatcherSer,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
Java利用Map實現(xiàn)計算文本中字符個數(shù)
這篇文章主要為大家詳細介紹了Java如何利用Map集合實現(xiàn)計算文本中字符個數(shù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-08-08
java線程池ThreadPoolExecutor的八種拒絕策略示例詳解
ThreadPoolExecutor是一個典型的緩存池化設(shè)計的產(chǎn)物,因為池子有大小,當池子體積不夠承載時,就涉及到拒絕策略。JDK中已預(yù)設(shè)了?4?種線程池拒絕策略,下面結(jié)合場景詳細聊聊這些策略的使用場景以及還能擴展哪些拒絕策略2021-11-11
解決接口調(diào)用報錯newSocketStream(..)failed:Too?many?open?files問題
這篇文章主要介紹了解決接口調(diào)用報錯newSocketStream(..)failed:Too?many?open?files問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
基于Java實現(xiàn)互聯(lián)網(wǎng)實時聊天系統(tǒng)(附源碼)
Netty?是一個利用?Java?的高級網(wǎng)絡(luò)的能力,隱藏其背后的復雜性而提供一個易于使用的?API?的客戶端/服務(wù)器框架。本文將利用它實現(xiàn)互聯(lián)網(wǎng)實時聊天系統(tǒng),感興趣的可以了解一下2022-09-09

