wait方法可以使當前執行緒進入到等待狀態,在沒有被喚醒的情況下,執行緒會一直保持等待狀態。
notify方法可以隨機喚醒單個在等待狀態下的執行緒。
來實現這樣的乙個功能:
讓兩個執行緒交替在控制台輸出一行文字
定義乙個print類,有兩個方法print1和print2,分別列印一行不同的內容
packagecom.sutaoyu.volatlt;
public
class
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方法
packagecom.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判斷。
packagecom.sutaoyu.volatlt;
public
class
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();}}
}
packagecom.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...