一、sleep與wait的區別
先舉例,在理論
公廁(公廁的坑位是共享資源)中無論多少人(人是執行緒)排隊,只要你鎖好廁門(synchronized)就不會出現執行緒安全問題,無論排隊的多么著急都要一個個來,鎖門期間(同步代碼塊內/同步方法內)呼叫sleep相當于你蹲坑期間睡著了,那么門鎖(同步鎖)肯定不會自動打開,依然是鎖著的,除非時間到了你睡醒了然后該干嘛干嘛,否則只能通過粗暴的方式先把你叫醒(interreput方法)再說,wait相當于你禮讓他人,先主動打開門鎖(wait呼叫后連釋放同步鎖)讓出坑位給別人,然后主動去加入排隊蹲坑的大部隊邊睡覺(行程陷入阻塞態)邊等待,
二 、notify和notifyAll()
如果有人上完廁所,出來后看到睡眠中的排隊者們,可以通過只叫醒一個(notify),但叫醒的一定是憋的最著急的人(優先級最高的執行緒),被叫醒的人能立刻獲得坑位資源,也可以選擇一次性喚醒所有(notifyAll)排隊者,這時排隊者會一窩蜂涌入爭強坑位,可無論多么激烈,只能有一個人搶占坑位,優先級越高的執行緒搶到茅坑資源的概率越大
sleep和wait都是用來進行執行緒控制,都可以使執行緒阻塞
1 sleep(milliseconds)可以用時間指定來使他自動醒過來,如果時間不到你只能呼叫interreput()來強行打斷;wait()可以用notify()/notifyAll()直接喚起.
2. sleep是Thread類的靜態方法, sleep的作用是讓執行緒休眠制定的時間,在時間到達時恢復,也就是說sleep將在接到時間到達事件事恢復執行緒 ; wait是Object的方法,也就是說可以對任意一個物件呼叫wait方法,呼叫wait方法將會將呼叫者的執行緒掛起,直到其他執行緒呼叫同一個物件的notify方法才會重新激活呼叫者
3. sleep()是讓某個執行緒暫停運行一段時間,其控制范圍是由當前執行緒決定,wait()是由某個確定的物件來呼叫的,
sleep和wait的區別有:
1、這兩個方法來自不同的類分別是Thread和Object
2、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法,
3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
4、sleep必須捕獲例外,而wait,notify和notifyAll不需要捕獲例外
經典案例,交替列印0~9
public class Accounter implements Runnable{
private int index;
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (this){
while (index < 10){
notify();
System.out.println(name + "列印:" + index);
index++;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Accounter accounter = new Accounter();
Thread thread = new Thread(accounter);
Thread thread2 = new Thread(accounter);
thread.start();
thread2.start();
}
}
推薦學習:消費者生產者案例
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255156.html
標籤:其他
下一篇:最近的安排
