Android多執行緒總結

SamanLan發表於2017-12-13

之前的多程式總結到現在的多執行緒總結,都是在別人的基礎上總結來的,在此也非常感謝前人,贈人玫瑰手留餘香。

在學習程式設計的時候聽到的很多都是多程式多執行緒,聽起來就高大上,隨便吹幾句就能嚇哄小菜鳥,好流弊的樣子~,~手動微笑。 當初的我還傻傻分不清這兩個東西,還一度以為是同一個東西呢,可是現在又有幾個人敢說自己很瞭解呢,慚愧慚愧,我也是其中之一。。。

場景一:假如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();
複製程式碼

迷之操作

完事,相信上面四個例子會對你日常開發會有所幫助的,再次感謝所有無私奉獻的程式猿們~,~

相關文章