Givemepass's Android 惡補筆記

如何使用Thread-2

| Comments

執行緒有自己的生命周期。

  • New(新建)
new Thread(myRunnable);

尚未啟動的狀態。

  • Runnable(可執行的)
new Thread(myRunnable).start();

進入可排程系統, 只要排程器(Scheduler)指派它給CPU執行, 則會開始執行run方法。

  • Blocked/Waiting(阻塞/等待)
Thread.sleep();
Thread.yield();

當執行緒遇到別的執行緒Lock住資源, 則Thread會進入waitng或blocked的狀態。

  • Terminated(終止) 當執行緒被中斷, 或者跑完run方法內的內容後, 則會進入結束狀態, 此時的設定跟燒毀是一項繁重的工作, 如果不斷的重複這件事情, 則會浪費資源, 應該考慮以Thread Pool來實作。

一般最常遇到的是如果執行緒跑到一半想要中斷它, 應該怎麼做?
當你查看API時,你會發現Thread的stop()方法已經被標示為deprecated,使用這個方法來停止一個執行緒是不被建議的。
如果你想要停止一個執行緒,你最好自行實作。

例如給他一個旗標(flag)。

new Thread(new Runnable(){
    public void run(){
        while(flag){
            //task

        }
    }
}).start();

由上面的例子可以知道, 加入一個flag當想要中止該thread, 可以讓flag不成立, 則立即結束Thread。
又或者可以這樣做, 發出一個Exception。

Thread thread = new Thread(new Runnable(){
    public void run(){
       try{
           //task

       } catch(InterruptExcetption e){
           //handle exception

       }
    }
});
thread.start();
thread.interrupt();

如上面的例子, 當啟動Thread以後, 想要停止就呼叫Interrupt則會發出Exception來停止Thread。

除了stop()之外,suspend()、resume()方法也被標示為"deprecated",這些方法如果你要達成相同的功能,你都必須自行實作。

如果想知道Android Thread的傳遞機制可以參考如何使用Handler

Comments

comments powered by Disqus