java多线程之wait_(三)java多线程之wait notify notifyAll
引言
今天我打算講一下Object.wait,Object.notify,Object.notifyAll這三個方法. 首先我們查看一下api看看,官方api對這幾個方法的介紹.
理論
Object.wait(): 導致當前線程一直等待,直到另一外一個線程用同一個對象調用Object.notify或Object.notifyAll方法.換種說法,就是調用Object.wait()和調用Object.wait(0)行為是一致的.
在調用wait時,必須要有調用對象的鎖.而這個鎖會一直等待直接這個對象調用notify或notifyAll方法才被釋放.這是等待的線程才能重新獲取對象的鎖而繼續執行.
這里需要防止中斷或假喚醒線程,所以一般在調用wait會使用循環,比如
synchronized (obj) {
while (當條件不滿足時)
obj.wait();
... // Perform action appropriate to condition
}
Object.notify/Object.notifyAll 喚醒一個擁有用到當前對象的鎖且在等待的線程.如果有多個等待的線程,則隨機喚醒一個.而被喚醒的線程會直到當前線程釋放對象的鎖后才被執行.被喚醒的線程會使用競爭的方式去獲取對象的鎖.這些被喚醒的線程都是一視同仁,不會被區別對待.所以每個線程獲取對象的鎖的幾率都是平等的,也是隨機的.
總之,在同一個時間點只能有一個線程擁有對象的鎖.
上面的解釋可能比較官方,出現什么對象的鎖,喚醒等待之類的時.初學者可能還不能很好的理解.現在我還是用上篇文章的比喻解釋一下.
比如現在有一群小明/'小紅'都想進入臥室,臥室的門只有一個,鑰匙也只有一把,每次也只能進入一個'小明'和一個小紅.(多了就...)這時候臥室里面如果只有有一個人,那么他/她就只能等待,然后釋放臥室門的鎖.然后喚醒另外一個她/他進來.進來后把臥室門給鎖了,等小明和小紅談完人生和理想的時候.再通知其他人,告訴他們房間是空的,可以進來了.這是另外的一群小明/小紅就會爭先恐后的進來.但還是只能進一個小明和一個小紅.(這里不理解,沒有關系,看完文章之后,再回過頭看一下這里,說不定就會豁然開朗了.)
這些人比喻就是上面講到的線程,臥室就相當于上面說的對象,門就相當于上面的鎖,這樣一比喻是不是好理解一點.需要注意的是臥室是特定的一個,即每個人等待的臥室都必須是同一個.這樣才能用那把鑰匙去開門.
編碼
如果有些人還不能理解,那么這里我就寫一個程序再來解析一下.就用上面的比喻做例子吧.ok,開始編碼.
首先,我們要先定一個抽象臥室類Room,這個類需要用成員變量gril,還必須提供兩個方法makeGridInRoom(String gril)和playWithGril(String boy),這個類的實現我們暫時先放放,后面再說
之后,我們要創建中間人來一個找小妞的類,GrilProduct,把臥室room傳進來,然后依此找到十個小妞進入臥室里.
public class GrilProduct implements Runnable{
private Room room;
public GrilProduct(Room room) {
this.room = room;
}
@Override
public void run() {
for (int i = 0; i < 10; i ++){
room.makeGridInRoom("小紅" + i + "號");
}
}
}
然后,我們還需要有一個花花公子類,來和小妞談談人生,說說理想,PlayBoy
public class PlayBoy implements Runnable{
private Room room;
private String boy;
public PlayBoy(Room room, String boy) {
this.room = room;
this.boy = boy;
}
@Override
public void run() {
room.playWithGril(boy);
}
}
最后,我們要讓那個中間人活動起來,而且需要來依此十個花花公子來和小妞談人生,談理想.畢竟小妞一個人也只能應付一個花花公子,加班是很累的.TestMain
public class TestMain {
public static void main(String[] args) {
Room room1 = new Room1();
playGameInRoom(room1);
// Room room2 = new Room2();
// playGameInRoom(room2);
//
// Room room3 = new Room3();
// playGameInRoom(room3);
//
// Room room4 = new Room4();
// playGameInRoom(room4);
}
public static void playGameInRoom(Room room){
Thread grilProduct = new Thread(new GrilProduct(room));
Set boyThread = new HashSet<>();
for (int i = 0; i < 10; i ++){
boyThread.add(new Thread(new PlayBoy(room, "小明" + i + "號")));
}
grilProduct.start();
for (Thread boy : boyThread){
boy.start();
}
}
}
行了,現在開始來考慮Room要怎么寫.
第一個想法,比較簡單,小妞來了就來了,花花公子來了就開始談人生,談理想.編寫Room1繼承Room
public class Room1 extends Room{
private String gril;
@Override
public synchronized void makeGridInRoom(String gril){
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
System.out.println(boy + " play with " + this.gril);
this.gril = null;
}
}
運行一下結果:
小明1號 play with 小紅9號
小明3號 play with null
小明6號 play with null
小明0號 play with null
小明8號 play with null
小明5號 play with null
小明7號 play with null
小明2號 play with null
小明4號 play with null
小明9號 play with null
我靠,怎么只有小明1號和小紅9號聊上了,其他公子自己玩. 哦,原來是小紅9號把前面幾個給擠掉了,其他小明,小紅不服了,憑什么小紅9號那么霸氣.行,為了滿足大家,繼續改..
第二個想法,如果花花公子來了,但小妞不在臥室,那么公子就會離開;另外如果一個小妞發現臥室有人,她也選擇離開.
public class Room2 extends Room{
@Override
public synchronized void makeGridInRoom(String gril){
if (this.gril != null){
return;
}
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
if (this.gril == null){
return;
}
System.out.println(boy + " play with " + this.gril);
this.gril = null;
}
}
運行結果是
小明1號 play with 小紅0號
而且每次運行結果都不一樣,這時候其他人不爽了,為什么我進入的時候沒人呢?
這里我們需要改變一下策略.如果臥室沒人.那么讓他們就睡一下,等待其他人來談完人生再走.
public class Room3 extends Room{
@Override
public synchronized void makeGridInRoom(String gril){
while (this.gril != null){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
this.gril = null;
}
}
運行結果.我靠,臥室被鎖了,而且只有一個人一直在里面孤零零的等著,永遠等不到另外一個人來.悲劇了.....
不行,我們還是要改變一下策略.如果花花公子發現臥室里沒有小妞,那就先等著.等待小妞來了,讓她來叫醒我.小妞也是一樣,如果臥室里已經有小妞了,那么就先等著,等他們談完人生,談完理想再來叫醒我.
public class Room4 extends Room{
@Override
public synchronized void makeGridInRoom(String gril){
while (this.gril != null){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = null;
}
}
運行結果:
小明9號 play with 小紅0號
小明1號 play with 小紅1號
小明4號 play with 小紅2號
小明3號 play with 小紅3號
小明2號 play with 小紅4號
小明6號 play with 小紅5號
小明7號 play with 小紅6號
小明0號 play with 小紅7號
小明5號 play with 小紅8號
小明8號 play with 小紅9號
謝天謝地啊,每個小明都找到小紅了,我再也不用擔心被小明/小紅在k死了.
后記
在最后兩種做法,一種是調用Thread.sleep,一種是調用Object.wait.兩種都是是線程睡眠等待,但為什么結果不一樣呢?這里解釋一下,Thread.sleep會釋放資源,但是不會釋放鎖,所以如果有人進入臥室,就一直霸占這這個臥室,其他壓根都進不來.但Object.wait除了會釋放資源之外,還會釋放鎖.等到小紅/小明進入臥室,在通知小明/小紅進入臥室.
還有使用Object.notifyAll和Object.notify,我自己覺得在可以使用Object.notify的地方,都可以使用Object.notifyAll代替,但是可以使用Object.notifyAll卻不能使用Object.notify代替. 在上述的例子,如果只有一個中間人GrilProduct只找一個小紅,而且也只有一個花花公子PlayBoy,那么使用Object.notify和Object.notifyAll都一樣,但是如果有多個花花公子,就必須使用Object.notifyAll去喚醒所有人,讓其中一個人跑進臥室里.其他人進不去,就繼續等待.然后繼續全部喚醒,繼續等待....
Object.wait()和Object.wait(long)的區別,wait()是進入臥室之后就一直等,直到被喚醒,wait(long)則是進入臥室之后一直等或者到了指定時間內被喚醒
對上面的例子改寫一下,在GrilProduct改為每500ms才找到一個小紅
public class GrilProduct implements Runnable{
private Room room;
public GrilProduct(Room room) {
this.room = room;
}
@Override
public void run() {
for (int i = 0; i < 10; i ++){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
room.makeGridInRoom("小紅" + i + "號");
}
}
}
然后對Room4.playWithGril改為
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
System.out.println(boy + " 我的心在等待,永遠在等待...");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = null;
}
運行一下
小明1號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明9號 play with 小紅0號
小明4號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明1號 play with 小紅1號
小明6號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明4號 play with 小紅2號
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明6號 play with 小紅3號
小明3號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明2號 play with 小紅4號
小明7號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明3號 play with 小紅5號
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明7號 play with 小紅6號
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明5號 play with 小紅7號
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明8號 play with 小紅8號
小明0號 我的心在等待,永遠在等待...
小明0號 play with 小紅9號
然后在對Room4.playWithGril改寫為
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
System.out.println(boy + " 我的心在等待,永遠在等待...");
this.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = null;
}
然后再運行一下
小明3號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明1號 我的心在等待,永遠在等待...
小明1號 play with 小紅0號
小明7號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明3號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明3號 play with 小紅1號
小明6號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明4號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明4號 play with 小紅2號
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明8號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明8號 play with 小紅3號
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明6號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明6號 play with 小紅4號
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明7號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明7號 play with 小紅5號
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明0號 我的心在等待,永遠在等待...
小明0號 play with 小紅6號
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明5號 我的心在等待,永遠在等待...
小明5號 play with 小紅7號
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明9號 我的心在等待,永遠在等待...
小明9號 play with 小紅8號
小明2號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明2號 我的心在等待,永遠在等待...
小明2號 play with 小紅9號
最后,聰明的讀者就自己對比一下,兩份輸出有什么不一樣的地方,就可以搞定wait()和wait(long)的區別,這時也應該能明白為什么wait方法的調用要寫在while循環里面了.
打賞
如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)
總結
以上是生活随笔為你收集整理的java多线程之wait_(三)java多线程之wait notify notifyAll的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5扫雷代码,使用js开发网页版
- 下一篇: 在Ubuntu18.04TLS下安装小米