1. 程式人生 > 其它 >執行緒通訊基礎(面向廁所程式設計)

執行緒通訊基礎(面向廁所程式設計)

技術標籤:java核心程式設計java多執行緒thread併發程式設計sync

一、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();
    }
}

推薦學習:消費者生產者案例