1. 程式人生 > >Android的執行緒詳解(幾種實現方法及區別)

Android的執行緒詳解(幾種實現方法及區別)

一、Android執行緒的定義和特點

    1.什麼是執行緒:

執行緒是一種輕量級程序,大多數情況下用於執行非同步操作。在一個Android 程式開始執行的時候,會單獨啟動一個程序,同時會產生一個UIThread執行緒(main執行緒)。一個Android 程式預設情況下也只有一個Process,但一個Process下卻可以有許多個Thread。

2.執行緒與程序的區別:

(1)地址空間:程序內的一個執行單元;程序至少有一個執行緒;它們共享程序的地址空間;而程序有自己獨立的地址空間;
(2)資源擁有:程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源
(3)執行緒是處理器排程的基本單位,但程序不是.
     (4)

執行緒只需要很少的資源就可“輕裝上陣”執行的優點,來彌補程序併發的“顆粒度”粗糙的缺點,提高系統資源(如:CPU,記憶體——又可分為資料區,堆疊區等等,和IO匯流排控制權……)利用率。

二、為什麼要用執行緒?
1.用於非同步操作。
2.預設的情況下,Service和Activity(還有Content Provider和Broadcast Receiver)會同時執行在程序的main執行緒中,是會相互阻塞的。因此要在服務中執行長時間的操作(如網路應用)時,還是要自己建立執行緒來操作。

三、執行緒的實現方法

     1.繼承Java.lang.Thread類,過載它的run()方法,用start()函式來啟動執行緒:

Thread thread=new Thread(new Runnable()  
        {  
            @Override  
            public void run()  
            {  
                Log.e("1111", "111111111");  
                // TODO Auto-generated method stub  
                Message message=new Message();  
                message.what=1;  
                mHandler.sendMessage(message);  
            }  
        });  
        thread.start();  

    2.實現Runnalbe介面,過載它的run()方法,用start()函式來啟動執行緒

<pre name="code" class="java">public class Title_Change_Demo extends Activity implements Runnable  
{  
    public Button button;  
    public LinearLayout my_layout;  
      
    public Handler mHandler=new Handler()  
    {  
        public void handleMessage(Message msg)  
        {  
            switch(msg.what)  
            {  
            case 1:  
                button.setText(R.string.text2);  
                break;  
            default:  
                break;            
            }  
            my_layout.invalidate();  
            super.handleMessage(msg);  
        }  
    };  
      
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        button=(Button)findViewById(R.id.button);  
        my_layout=(LinearLayout)findViewById(R.id.my_layout);  
          
        Thread thread=new Thread(this);  
        thread.start();  
    }  
      
    @Override  
    public void run()  
    {  
        Log.e("ok", "111111111");  
        // TODO Auto-generated method stub  
        Message message=new Message();  
        message.what=1;  
        mHandler.sendMessage(message);  
    }  
}  


3.既然說的是Android,我們不得不提到的是AsyncTask AsyncTask是Android框架提供的非同步處理的輔助類,它可以實現耗時操作在其他執行緒執行,而處理結果在Main執行緒執行。使用他你會發現你的程式碼很容易被理解,因為他們都有一些具有特定職責的方法,尤其是AsyncTask,有預處理的方法onPreExecute,有後臺執行任務的方法doInBackground,有更新進度的方法publishProgress,有返回結果的方法onPostExecute等等。不過封裝越好越高階的API,對初級程式設計師反而越不利,就是你不瞭解它的原理。當你需要面對更加複雜的情況,而高階API無法完成得很好時,你就杯具了。

三、那麼,繼承Thread類與實現Runnable介面有什麼區別?優缺點?

  1.首先,我們不妨看一下Java的API,如下圖。我們發現Thread是實現了Runnable介面

  2.在Java中,類僅支援單繼承,也就是說,當定義一個新的類的時候,它只能擴充套件一個外部類.

  如果自定義執行緒類繼承自Thread,那麼它無法再繼承其他類,擁有其他類的方法,降低了類的擴充套件性。但是,如果通過實現Runnable介面,你就可以繼承其他類了。

  3.還有一點最重要,就是使用實現Runnable介面的方式建立的執行緒可以處理同一資源,從而實現資源的共享:

   比如模擬一個火車站的售票系統,假如只有100張火車篇,且允許所有視窗賣這100張票,那麼每一個視窗也相當於一個執行緒,但需要處理的資源是同一個資源,即100張車票。如果還用前面的方式來建立執行緒顯然是無法實現的,這種情況該怎樣處理呢?看下面這個程式:

    public class MutliThreadDemo {  
        public static void main(String[] args) {  
            MutliThread m=new MutliThread();   
            Thread t1=new Thread(m);   
            Thread t2=new Thread(m);   
            Thread t3=new Thread(m);   
            t1.start();   
            t2.start();   
            t3.start();   
        }  
    } 
   public class MutliThread implements Runnable{   
        private int ticket=100;//每個執行緒都擁有100張票   
        public void run(){   
            while(ticket>0){   
                System.out.println(ticket--+" is saled by "+Thread.currentThread());   
            }   
        }   
    } 

程式在記憶體中僅建立了一個資源,而新建的三個執行緒都是基於訪問這同一資源的,並且由於每個執行緒上所執行的是相同的程式碼,因此它們執行的功能也是相同的。可見,如果現實問題中要求必須建立多個執行緒來執行同一任務,而且這多個執行緒之間還將共享同一個資源,那麼就可以使用實現Runnable介面的方式來建立多執行緒程式。這樣一來,執行緒、程式碼和資料資源三者有效分離,很好地體現了面向物件程式設計的思想。因此,幾乎所有的多執行緒程式都是通過實現Runnable介面的方式來完成的。

// 如果覺得不錯,記得頂我哦! 頂我!頂我!頂我!