摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言今天我打算講一下這三個方法首先我們查看一下看看官方對這幾個方法的介紹理論導(dǎo)致當(dāng)前線程一直等待直到另一外一個線程用同一個對象調(diào)用或方法換種說法就是調(diào)用和調(diào)用行為是一致的在調(diào)
引言本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載
今天我打算講一下Object.wait,Object.notify,Object.notifyAll這三個方法. 首先我們查看一下api看看,官方api對這幾個方法的介紹.
理論Object.wait(): 導(dǎo)致當(dāng)前線程一直等待,直到另一外一個線程用同一個對象調(diào)用Object.notify或Object.notifyAll方法.換種說法,就是調(diào)用Object.wait()和調(diào)用Object.wait(0)行為是一致的.
在調(diào)用wait時,必須要有調(diào)用對象的鎖.而這個鎖會一直等待直接這個對象調(diào)用notify或notifyAll方法才被釋放.這是等待的線程才能重新獲取對象的鎖而繼續(xù)執(zhí)行.
這里需要防止中斷或假喚醒線程,所以一般在調(diào)用wait會使用循環(huán),比如
synchronized (obj) { while (當(dāng)條件不滿足時) obj.wait(); ... // Perform action appropriate to condition }
Object.notify/Object.notifyAll 喚醒一個擁有用到當(dāng)前對象的鎖且在等待的線程.如果有多個等待的線程,則隨機喚醒一個.而被喚醒的線程會直到當(dāng)前線程釋放對象的鎖后才被執(zhí)行.被喚醒的線程會使用競爭的方式去獲取對象的鎖.這些被喚醒的線程都是一視同仁,不會被區(qū)別對待.所以每個線程獲取對象的鎖的幾率都是平等的,也是隨機的.
總之,在同一個時間點只能有一個線程擁有對象的鎖.
上面的解釋可能比較官方,出現(xiàn)什么對象的鎖,喚醒等待之類的時.初學(xué)者可能還不能很好的理解.現(xiàn)在我還是用上篇文章的比喻解釋一下.
比如現(xiàn)在有一群小明/"小紅"都想進入臥室,臥室的門只有一個,鑰匙也只有一把,每次也只能進入一個"小明"和一個小紅.(多了就...)這時候臥室里面如果只有有一個人,那么他/她就只能等待,然后釋放臥室門的鎖.然后喚醒另外一個她/他進來.進來后把臥室門給鎖了,等小明和小紅談完人生和理想的時候.再通知其他人,告訴他們房間是空的,可以進來了.這是另外的一群小明/小紅就會爭先恐后的進來.但還是只能進一個小明和一個小紅.(這里不理解,沒有關(guān)系,看完文章之后,再回過頭看一下這里,說不定就會豁然開朗了.)
編碼這些人比喻就是上面講到的線程,臥室就相當(dāng)于上面說的對象,門就相當(dāng)于上面的鎖,這樣一比喻是不是好理解一點.需要注意的是臥室是特定的一個,即每個人等待的臥室都必須是同一個.這樣才能用那把鑰匙去開門.
如果有些人還不能理解,那么這里我就寫一個程序再來解析一下.就用上面的比喻做例子吧.ok,開始編碼.
首先,我們要先定一個抽象臥室類Room,這個類需要用成員變量gril,還必須提供兩個方法makeGridInRoom(String gril)和playWithGril(String boy),這個類的實現(xiàn)我們暫時先放放,后面再說
之后,我們要創(chuàng)建中間人來一個找小妞的類,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 + "號"); } } }
然后,我們還需要有一個花花公子類,來和小妞談?wù)勅松?說說理想,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); } }
最后,我們要讓那個中間人活動起來,而且需要來依此十個花花公子來和小妞談人生,談理想.畢竟小妞一個人也只能應(yīng)付一個花花公子,加班是很累的.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)); SetboyThread = 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(); } } }
行了,現(xiàn)在開始來考慮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; } }
運行一下結(jié)果:
小明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號那么霸氣.行,為了滿足大家,繼續(xù)改..
第二個想法,如果花花公子來了,但小妞不在臥室,那么公子就會離開;另外如果一個小妞發(fā)現(xiàn)臥室有人,她也選擇離開.
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; } }
運行結(jié)果是
小明1號 play with 小紅0號
而且每次運行結(jié)果都不一樣,這時候其他人不爽了,為什么我進入的時候沒人呢?
這里我們需要改變一下策略.如果臥室沒人.那么讓他們就睡一下,等待其他人來談完人生再走.
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; } }
運行結(jié)果.我靠,臥室被鎖了,而且只有一個人一直在里面孤零零的等著,永遠等不到另外一個人來.悲劇了.....
不行,我們還是要改變一下策略.如果花花公子發(fā)現(xiàn)臥室里沒有小妞,那就先等著.等待小妞來了,讓她來叫醒我.小妞也是一樣,如果臥室里已經(jīng)有小妞了,那么就先等著,等他們談完人生,談完理想再來叫醒我.
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; } }
運行結(jié)果:
小明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號
謝天謝地啊,每個小明都找到小紅了,我再也不用擔(dān)心被小明/小紅在k死了.
后記在最后兩種做法,一種是調(diào)用Thread.sleep,一種是調(diào)用Object.wait.兩種都是是線程睡眠等待,但為什么結(jié)果不一樣呢?這里解釋一下,Thread.sleep會釋放資源,但是不會釋放鎖,所以如果有人進入臥室,就一直霸占這這個臥室,其他壓根都進不來.但Object.wait除了會釋放資源之外,還會釋放鎖.等到小紅/小明進入臥室,在通知小明/小紅進入臥室.
還有使用Object.notifyAll和Object.notify,我自己覺得在可以使用Object.notify的地方,都可以使用Object.notifyAll代替,但是可以使用Object.notifyAll卻不能使用Object.notify代替. 在上述的例子,如果只有一個中間人GrilProduct只找一個小紅,而且也只有一個花花公子PlayBoy,那么使用Object.notify和Object.notifyAll都一樣,但是如果有多個花花公子,就必須使用Object.notifyAll去喚醒所有人,讓其中一個人跑進臥室里.其他人進不去,就繼續(xù)等待.然后繼續(xù)全部喚醒,繼續(xù)等待....
Object.wait()和Object.wait(long)的區(qū)別,wait()是進入臥室之后就一直等,直到被喚醒,wait(long)則是進入臥室之后一直等或者到了指定時間內(nèi)被喚醒
對上面的例子改寫一下,在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)的區(qū)別,這時也應(yīng)該能明白為什么wait方法的調(diào)用要寫在while循環(huán)里面了.
打賞如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67043.html
摘要:前言上一篇文章我們講了的同步代碼塊這一篇我們來看看同步代碼塊之間的協(xié)作與通信閱讀本篇前你需要知道什么是同步代碼塊什么是監(jiān)視器鎖還不是很了解的同學(xué)建議先去看一看上一篇文章本文的源碼基于系列文章目錄概述在中我們可以使用這個方法來實現(xiàn)同步代碼塊之 前言 上一篇文章我們講了java的同步代碼塊, 這一篇我們來看看同步代碼塊之間的協(xié)作與通信. 閱讀本篇前你需要知道什么是同步代碼塊, 什么是監(jiān)視器...
摘要:一線程的基本概念單線程簡單的說,單線程就是進程中只有一個線程。多線程由一個以上線程組成的程序稱為多線程程序。當(dāng)線程調(diào)用完方法進入后會自動釋放鎖,線程獲得鎖。 一、線程的基本概念 1.1 單線程 簡單的說,單線程就是進程中只有一個線程。單線程在程序執(zhí)行時,所走的程序路徑按照連續(xù)順序排下來,前面的必須處理好,后面的才會執(zhí)行。 Java示例: public class SingleThrea...
摘要:為了解決這個問題于是引入了生產(chǎn)者和消費者模式。代碼實現(xiàn)多生產(chǎn)者和多消費者實現(xiàn)阻塞隊列,將生產(chǎn)者和消費者解耦。已經(jīng)滿了等待用使用于多個生產(chǎn)者的情況說明中有元素可以取用使用于多個消費者的情況。 為什么要使用生產(chǎn)者和消費者模式 在線程世界里,生產(chǎn)者就是生產(chǎn)數(shù)據(jù)的線程,消費者就是消費數(shù)據(jù)的線程。 在多線程開發(fā)當(dāng)中,如果生產(chǎn)者處理速度很快,而消費者處理速度很慢,那么生產(chǎn)者就必須等待消費者處理完...
摘要:已經(jīng)在上面有提到過,和的作用是喚醒正在的線程,是隨機喚醒線程中的一個,則是喚醒全部。釋放和不釋放鎖在多線程的操作中,鎖的釋放與否是必須要清楚的,是會釋放鎖,而則不會。 wait wait方法是Object中的方法,這個方法的功能特性:1).執(zhí)行wait方法的前提是當(dāng)前線程已經(jīng)獲取到對象的鎖,也就是wait方法必須在synchronized修飾的代碼塊或者方法中使用。2).執(zhí)行wait之...
閱讀 1777·2021-10-19 13:30
閱讀 1352·2021-10-14 09:48
閱讀 1544·2021-09-22 15:17
閱讀 2016·2019-08-30 15:52
閱讀 3282·2019-08-30 11:23
閱讀 1994·2019-08-29 15:27
閱讀 898·2019-08-29 13:55
閱讀 762·2019-08-26 14:05