場景一:假如APP須要訪問兩個接口獲得數據,在兩個接口數據返回時再進行操做下一步。程序員
是否是第一時間想到就是寫兩個線程就完事了?
上面的解決方案弊端很明顯是吧~,~囧。線程沒法得知另外一個線程的狀態
解決方案:三個線程,兩個線程同時執行,一個線程等待,先完成的等待未完成的一個,直到都完成了才執行等待的線程,這TM就是題目好嗎。
看到解決方案,大家或許會說這還不簡單,等待線程寫個while()不就好了嗎,一直查詢兩個線程的完成狀態。能夠,這很nice。可是程序員要幹嗎,要裝逼啊,要寫出別人看不懂的代碼o(╯□╰)o。
仍是看代碼吧,不要打我面試
代碼ide
執行結果spa
怎麼樣,代碼很簡單吧,可是逼格是否是立馬就上來,不少程序員都不知道CountDownLatch是什麼來呢。
其實它就是一個計數器,await()是等待計時器爲0後才執行下去,countDown()是使計數器減一。get到沒。不要你while來while去的,簡單省事不容易出錯。線程
場景二:假如產品拿着刀來講,我要請求剛纔兩個接口,請求完後獲得兩個接口數據,再一塊兒執行不一樣的操做。code
麻蛋,上面不是說了嗎,我tm開四個線程,兩個請求兩個等待不就好了?呵呵噠,天真爛漫,上面所說的計數器做用效果只有一次,那就是說只能用於一個線程裏面。我能怎麼辦,我也很絕望啊。
來來來,裝逼的時候又到了。接口
又是很簡單的代碼
ip
動圖完事開發
是否是和上面很相似,用法更簡單,就一個await(),設定了cyclicBarrier的值爲2後,當調用await後就會暫停並等待,當調用次數達到2後,全部暫停的都會開始。裝逼完畢~,~get
場景三:面試官問你,怎麼讓兩個線程依次執行?
是否是脫口而出在一個線程執行完後在線程裏再開一個線程~,~,你看面試官會不會打死你。
這更加簡單,直接上代碼吧。
搞掂
情景四:小明打了老王一巴掌,老王打回他,小明又打老王一巴掌,循環如此~,~
我勒個擦,這麼奇葩。
還好,上有政策下游對策。
final Object object = new Object();
final Thread threadA = new Thread(new Runnable() { @Override public void run() { int i = 0; while (i < 5) { synchronized (object) { try { System.out.println("小明打了老王一巴掌"); object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); int i = 0; while (i < 5) { synchronized (object) { System.out.println("老王打了小明一巴掌"); object.notify(); i++; } Thread.sleep(1500); } } catch (InterruptedException e) { e.printStackTrace(); } } }); threadA.start(); threadB.start();
迷之操做完事,相信上面四個例子會對你平常開發會有所幫助的,再次感謝全部無私奉獻的程序猿們~,~