Android多線程總結

場景一:假如APP須要訪問兩個接口獲得數據,在兩個接口數據返回時再進行操做下一步。程序員

是否是第一時間想到就是寫兩個線程就完事了?
上面的解決方案弊端很明顯是吧~,~囧。線程沒法得知另外一個線程的狀態
解決方案:三個線程,兩個線程同時執行,一個線程等待,先完成的等待未完成的一個,直到都完成了才執行等待的線程,這TM就是題目好嗎。
看到解決方案,大家或許會說這還不簡單,等待線程寫個while()不就好了嗎,一直查詢兩個線程的完成狀態。能夠,這很nice。可是程序員要幹嗎,要裝逼啊,要寫出別人看不懂的代碼o(╯□╰)o。
仍是看代碼吧,不要打我面試

clipboard.png

代碼ide

clipboard.png

執行結果spa

怎麼樣,代碼很簡單吧,可是逼格是否是立馬就上來,不少程序員都不知道CountDownLatch是什麼來呢。
其實它就是一個計數器,await()是等待計時器爲0後才執行下去,countDown()是使計數器減一。get到沒。不要你while來while去的,簡單省事不容易出錯。線程

場景二:假如產品拿着刀來講,我要請求剛纔兩個接口,請求完後獲得兩個接口數據,再一塊兒執行不一樣的操做。code

麻蛋,上面不是說了嗎,我tm開四個線程,兩個請求兩個等待不就好了?呵呵噠,天真爛漫,上面所說的計數器做用效果只有一次,那就是說只能用於一個線程裏面。我能怎麼辦,我也很絕望啊。
來來來,裝逼的時候又到了。接口

clipboard.png

又是很簡單的代碼
clipboard.pngip

動圖完事開發

是否是和上面很相似,用法更簡單,就一個await(),設定了cyclicBarrier的值爲2後,當調用await後就會暫停並等待,當調用次數達到2後,全部暫停的都會開始。裝逼完畢~,~get

場景三:面試官問你,怎麼讓兩個線程依次執行?

是否是脫口而出在一個線程執行完後在線程裏再開一個線程~,~,你看面試官會不會打死你。
這更加簡單,直接上代碼吧。

clipboard.png

clipboard.png

搞掂
情景四:小明打了老王一巴掌,老王打回他,小明又打老王一巴掌,循環如此~,~

我勒個擦,這麼奇葩。
還好,上有政策下游對策。

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();

clipboard.png

迷之操做完事,相信上面四個例子會對你平常開發會有所幫助的,再次感謝全部無私奉獻的程序猿們~,~

相關文章
相關標籤/搜索