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介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...