什么是線程?
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態是指線程占有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。如何使用多線程
1.AsyncTask異步多線程
AsyncTask的規范型很強,能夠時時反映更新的情況
它一般有這么幾個方法
onPreExecute(), 該方法將在執行實際的后臺操作前被UI 線程調用。可以在該方法中做一些準備工作,如在界面上顯示一個進度條,或者一些控件的實例化,這個方法可以不用實現。
doInBackground(Params...), 將在onPreExecute 方法執行后馬上執行,該方法運行在后臺線程中。這里將主要負責執行那些很耗時的后臺處理工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
onProgressUpdate(Progress...),在publishProgress方法被調用后,UI 線程將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。
onPostExecute(Result), 在doInBackground 執行完成后,onPostExecute 方法將被UI 線程調用,后臺的計算結果將通過該方法傳遞到UI 線程,并且在界面上展示給用戶.
class TestTask extends AsyncTask<Integer,Integer,String>{
@Override
protected void onPreExecute() {
// main thread ,before doInBackground();
mTextView.setText("加載中");
super.onPreExecute();
}
@Override
protected String doInBackground(Integer... params) {
// worker thread
// download parse xml data
return String.valueOf(params[0] * 2 + 2);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// main thread ,after doInBackground();
mTextView.setText("加載完成, 結果是:" + result);
}
}
}
2.Actiavity.run.runOnUiThread(new Runnable()
new Thread(new Runnable() { // work 線程
@Override
public void run() {
// 第一種
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText("我在其它線程中千辛萬苦來看你……"); }
});
3.View.post(new Runnable)
mTextView.post(new Runnable() {
@Override
public void run() {
mTextView.setText("我在其它線程中千辛萬苦來看你……");
}
}) ;
4.View.postDelayed(Runnable,long)
mTextView.postDelayed(new Runnable() {
@Override
public void run() {
mTextView.setText("我在其它線程中千辛萬苦來看你……");
}
},1000);
5.Handler 機制,它是Runnable和Activity交互的橋梁,在run方法中發送Message,在Handler里,通過不同的Message執行不同的任務。
(Handler的設計實際上是為了應用程序內其他線程和主線程進行通信,因為只有主線程才能更新UI,其他線程不行)