兩線程間通訊

2021-07-27 13:08:07 字數 1857 閱讀 8188

建立兩個執行緒類

package thread01;

public

class

t1extends

thread

public

void

run() catch (interruptedexception e) }}

}

package thread01;

public

class

t2extends

thread

public

void

run() catch (interruptedexception e) }}

}

假如現在要實現乙個功能,列印一次aaa,再列印一次bbbbbb,再列印一次aaa,再列印一次bbbbbb。。。。。。

package thread01;

public

class printer

system.out.print("a");

system.out.print("a");

system.out.print("a");

system.out.println();

flag = 2; // 修改標記

this.notify();// 喚醒另外一條執行緒}}

public

void

printb() throws interruptedexception

system.out.print("b");

system.out.print("b");

system.out.print("b");

system.out.print("b");

system.out.print("b");

system.out.print("b");

system.out.println();

flag = 1;

this.notify();}}

}

package thread01;

public

class demo01

}

解析:上面開啟了兩個執行緒t1,t2,它們誰先執行是隨機的。假如現在t2先執行,呼叫printb函式,進入同步**塊(在同步**塊裡面,其他執行緒不能強佔執行,直到該執行緒的同步**塊執行完),由於flag此時等於1,所以1!=2 if條件為真,該執行緒處於等待狀態,不再向下執行。並且該執行緒釋放物件鎖(注意wait()與sleep()的區別,wait()釋放物件鎖,sleep()不釋放物件鎖),然後執行緒t1獲取物件鎖(注意同步**塊的物件鎖必須是同一把鎖,即同乙個物件),進入同步**塊,由於flag=1所以1!=1為假,if條件不滿足。開始列印aaa,然後修改標誌位,flag=2;再執行notify()方法。該方法會喚醒另乙個執行緒,即t2,此時t1的同步**塊執行完,釋放物件鎖,此時t2被喚醒,立刻獲得物件鎖,又鎖上了同步**塊,(注意在哪等待,喚醒後就從哪開始執行,所以此時t2不用再判斷,直接執行了,因為是if判斷,假如是while則需要繼續判斷,)列印bbbbbb,然後改變標誌位flag=1,執行notify()方法,喚醒執行緒t1(儘管執行緒t1沒有等待,也喚醒它一次,不影響)。釋放物件鎖。然後執行緒t1和t2又開始強佔資源了。。。。

注意:

1、sleep()與wait()的區別

sleep()指定時間過後,自己醒。不釋放鎖。

wait()必須讓別人叫醒,釋放鎖。

2、用哪個物件鎖,就用哪個wait(),notiyfy()。

3、開啟執行緒使用start(),不是run()。

4、wait()是使當前執行緒等待,notify()是叫醒其他執行緒

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...

執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...