之前的多程式總結到現在的多執行緒總結,都是在別人的基礎上總結來的,在此也非常感謝前人,贈人玫瑰手留餘香。
在學習程式設計的時候聽到的很多都是多程式多執行緒,聽起來就高大上,隨便吹幾句就能嚇哄小菜鳥,好流弊的樣子~,~手動微笑。 當初的我還傻傻分不清這兩個東西,還一度以為是同一個東西呢,可是現在又有幾個人敢說自己很瞭解呢,慚愧慚愧,我也是其中之一。。。
場景一:假如APP需要訪問兩個介面得到資料,在兩個介面資料返回時再進行操作下一步。
是不是第一時間想到就是寫兩個執行緒就完事了? 上面的解決方案弊端很明顯是吧~,~囧。執行緒無法得知另一個執行緒的狀態 解決方案:三個執行緒,兩個執行緒同時執行,一個執行緒等待,先完成的等待未完成的一個,直到都完成了才執行等待的執行緒,這TM就是題目好嗎。 看到解決方案,你們或許會說這還不簡單,等待執行緒寫個while()不就行了嗎,一直查詢兩個執行緒的完成狀態。可以,這很nice。但是程式設計師要幹嘛,要裝逼啊,要寫出別人看不懂的程式碼o(╯□╰)o。 還是看程式碼吧,不要打我
怎麼樣,程式碼很簡單吧,但是逼格是不是立馬就上來,很多程式設計師都不知道CountDownLatch是什麼來呢。 其實它就是一個計數器,await()是等待計時器為0後才執行下去,countDown()是使計數器減一。get到沒。不要你while來while去的,簡單省事不容易出錯。場景二:假如產品拿著刀來說,我要請求剛才兩個介面,請求完後得到兩個介面資料,再一起執行不同的操作。
麻蛋,上面不是說了嗎,我tm開四個執行緒,兩個請求兩個等待不就行了?呵呵噠,天真爛漫,上面所說的計數器作用效果只有一次,那就是說只能用於一個執行緒裡面。我能怎麼辦,我也很絕望啊。 來來來,裝逼的時候又到了。
是不是和上面很類似,用法更簡單,就一個await(),設定了cyclicBarrier的值為2後,當呼叫await後就會暫停並等待,當呼叫次數達到2後,所有暫停的都會開始。裝逼完畢~,~場景三:面試官問你,怎麼讓兩個執行緒依次執行?
是不是脫口而出在一個執行緒執行完後線上程裡再開一個執行緒~,~,你看面試官會不會打死你。 這更加簡單,直接上程式碼吧。
情景四:小明打了老王一巴掌,老王打回他,小明又打老王一巴掌,迴圈如此~,~
我勒個擦,這麼奇葩。 還好,上有政策下游對策。
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();
複製程式碼
完事,相信上面四個例子會對你日常開發會有所幫助的,再次感謝所有無私奉獻的程式猿們~,~