Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android多線程研究(4)從一道面試題說起

Android多線程研究(4)從一道面試題說起

編輯:Android開發教程

有一道這樣的面試題:開啟一個子線程和主線程同時運行,子線程輸出10次後接著主線程輸出100次,如此反復50次。先看下面代碼:

package com.maso.test;  
      
/** 
 *  
 * @author Administrator 
 * 兩個線程,其中是一個主線程,第一個線程先運行輸出10次,主線程接著運行輸出100次,如此反復50次 
 */
public class ThreadTest3 implements Runnable{  
    private static Test test;  
    @Override
    public void run() {  
        for(int i=0; i<50; i++){  
            test.f1(i);  
        }  
    }  
          
    public static void main(String[] args) {  
        test = new Test();  
        new Thread(new ThreadTest3()).start();  
        for(int i=0; i<50; i++){  
            test.f2(i);  
        }  
    }  
          
    /** 
     * 將控制和邏輯及數據分類(該類就是數據) 
     * @author Administrator 
     * 
     */
    static class Test{  
        private boolean isf1 = true;  
        /** 
         * 輸出10次 
         */
        public synchronized void f1(int j){  
            if(!isf1){  
                try {  
                    this.wait();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
            for(int i=1; i<=10; i++){  
                System.out.println(Thread.currentThread().getName() + "第" + j + "次輪巡,輸出" + i);  
            }  
            isf1 = false;  
            notify();  
        }  
              
        /** 
         * 輸出100次 
         */
        public synchronized void f2(int j){  
            if(isf1){  
                try {  
                    this.wait();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
            for(int i=1; i<=100; i++){  
                System.out.println(Thread.currentThread().getName() + "第" + j + "次輪巡,輸出" + i);  
            }  
            isf1 = true;  
            notify();  
        }  
    }  
}

上面判斷用的是if語句,這樣做看似沒有什麼問題,實際上這樣做是不安全的,因為線程在等待的過程中有可能被假喚醒,所以我們需要使用while語句。另外在使用wait和notify的時候需要注意一下幾點:

 

1、調用object的wait方法和notity方法時,必須先獲得object的對象鎖(必須寫在synchronized中)。

2、如果調用了object的wait方法,則該線程就放掉了對象鎖。

3、如果A1、A2、A3都在object.wait(),則B調用object.notify()只能喚醒A1、A2、A3中的一個(具體哪一個由JVM決定)

4、object.notifyAll()能夠喚醒全部。

5、B在喚醒A的時候,B如果還持有對象鎖,則要等到B釋放鎖後,A才有機會執行。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved