Givemepass's Android 惡補筆記

如何使用Thread-1

| Comments

在Android要使用執行緒必須實作Runnable,

public class MyTask implements Runnable{
    public void run(){
        //execute your task

    }
}

然後塞到Thread呼叫start方法就可以開始執行了。

new Thread(new MyTask()).start();

Android是一個多工環境, 利用MultiThread可以讓系統效能更有效的利用,
CPU會根據排程器(Scheduler)來決定要執行哪一個Thread,
如果想要讓CPU優先執行你的任務, 則可以設定priority。

myThread.setPriority(10);

順序是1(最低)到10(最高), 一般預設值是5。
如果一個Thread優先權太低, 那麼有可能發生沒有足夠時間執行完任務, 稱之為執行緒飢餓(starvation)。
聽過一個故事, 曾經有一個系統執行了10年, 後來發現有一個Thread在系統內飢餓了10年。

CPU如果要從ThreadA切換到ThreadB執行, 稱之為本文切換(Context Switch),
Context swtich對於CPU來說是一種負擔, 因此如果開太多Thread則會造成系統上很大的負擔,
效能上也就越來越差。

太多Thread也會造成複雜度增加, 因為你會無法得知執行順序。

for(int i = 0; i < 10; i++){
    new Thread(new Runnable(){
        public void run(){
            //long time task

        }
    }).start();
}

以上的例子將會開啟10個Threas執行任務, 但是完成的時間卻是不固定的。

如果2個或以上的執行緒一起共同存取一塊資料又稱為臨界區段(Critical section),
則會造成資料上的不一致,稱之為競態條件(Race Condition)。

解決這個問題, 一般會在進入Critical section加入一把鎖(Lock),
舉個例子:
當你在使用廁所, 所以你把門鎖起來, 等你使用完畢以後, 就把門打開, 讓其他人可以使用廁所,
但是加入鎖卻會讓CPU效能降低, 因為其他的Thread必須等待你使用完才可以使用,
因此鎖就出現了許多演算法(後面再講)。

那一般JAVA要使用鎖通常都會使用synchronized這個關鍵字。

synchronized(this){
    mVar++;
}

而synchronized可以鎖物件、鎖方法、鎖變數...等。
請參考官網

在Thread上執行不會發生Race Condition稱之為執行緒安全(Thread safety)。
在某些資料結構上面, 會考慮到執行緒安全,
例如HashMap就是一個執行緒不安全的資料結構, 可以改用ConcurrentHashMap。

Thread的生命週期可以參考如何使用Thread-2

Comments

comments powered by Disqus