64 執行緒之間的通訊

2022-03-17 04:47:05 字數 2369 閱讀 5974

wait方法可以使當前執行緒進入到等待狀態,在沒有被喚醒的情況下,執行緒會一直保持等待狀態。

notify方法可以隨機喚醒單個在等待狀態下的執行緒

來實現這樣的乙個功能:

讓兩個執行緒交替在控制台輸出一行文字

定義乙個print類,有兩個方法print1和print2,分別列印一行不同的內容

package

com.sutaoyu.volatlt;

public

class

print

catch

(interruptedexception e)

}system.out.println("monkey");

flag = 2;

//隨機的喚醒單個等待的執行緒

this

.notify();}}

public

void

print2()

catch

(interruptedexception e)

}system.out.println("1024");

flag = 1;

this

.notify();}}

}

定義執行緒測試類,開啟兩個執行緒,分別執行print類中print1和print2方法

package

com.sutaoyu.volatlt;

public

class

notifytest01 }};

thread t2 = new

thread() }};

t1.start();

t2.start();

}}

改造上面**在print類中新增乙個print3方法,再開啟第三個執行緒來執行這個方法。

另外需要修改的地方是:

1.因為notifyall方法可以喚醒所有等待狀態的執行緒,所有用notifyall方法來替代notify方法

2.當執行緒被喚醒後,需要先判斷一下flag的值,if不會重新判斷flag值,而while會重新判斷flag的值,所以將print中的if判斷修改為while判斷。

package

com.sutaoyu.volatlt;

public

class

print

catch

(interruptedexception e)

}system.out.println("monkey");

flag = 2;

//隨機的喚醒單個等待的執行緒

this

.notifyall();}}

public

void

print2()

catch

(interruptedexception e)

}system.out.println("1024");

flag = 3;

this

.notifyall();}}

public

void

print3()

catch

(interruptedexception e)

}system.out.println("888");

flag = 1;

this

.notifyall();}}

}

package

com.sutaoyu.volatlt;

public

class

notifytest01 }};

thread t2 = new

thread() }};

thread t3 = new

thread() }};

t1.start();

t2.start();

t3.start();

}}

在print1,2,3方法中同步**塊中使用哪個物件作為鎖,那在呼叫wait和notify方法時一定要呼叫這個物件上的wait和notify方法。

上面程式使用this作為物件鎖,在下面呼叫的都是this.wait()和this.notify()方法。

在多執行緒執行當中

wait方法釋放物件鎖,根據上面的**示例,t1,t2,t3三個執行緒使用的是同乙個物件鎖,如果wait方法不釋放鎖的話,別的執行緒就不能獲取到該鎖,也就不能獲取cpu的執行權了。

sleep和notify方法不釋放物件鎖,上面**示例中,如果notify方法釋放鎖的話,別的執行緒就有可能獲取到cpu的執行權,這樣子就會導致當前notify方法後面的**還未執行完畢就失去了cpu的執行權,從而導致一些問題,只有當執行緒執行完synchronized**塊後才會釋放鎖。

執行緒之間的通訊

class resclass inthread extends thread override public void run else count count 1 2 class outthread extends thread override public void run 資料發生錯亂,造成...

程序之間 執行緒之間的通訊方式

1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...

多執行緒之間通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。需求 第乙個執行緒寫入 input 使用者,另乙個執行緒取讀取 out 使用者.實現讀乙個,寫乙個操作。共享資源源實體類 class res輸入執行緒資源 class intthrad extends thread overr...