Android的執行緒詳解(幾種實現方法及區別)
一、Android執行緒的定義和特點
1.什麼是執行緒:
執行緒是一種輕量級程序,大多數情況下用於執行非同步操作。在一個Android 程式開始執行的時候,會單獨啟動一個程序,同時會產生一個UIThread執行緒(main執行緒)。一個Android 程式預設情況下也只有一個Process,但一個Process下卻可以有許多個Thread。
2.執行緒與程序的區別:
(1)地址空間:程序內的一個執行單元;程序至少有一個執行緒;它們共享程序的地址空間;而程序有自己獨立的地址空間;
(2)資源擁有:程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源
(3)執行緒是處理器排程的基本單位,但程序不是.
(4)
二、為什麼要用執行緒?
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介面的方式來完成的。
// 如果覺得不錯,記得頂我哦! 頂我!頂我!頂我!