什么是線程?
線程谒拴,有時被稱為輕量級進程(Lightweight Process,LWP)涉波,是程序執(zhí)行流的最小單元英上。一個標準的線程由線程ID,當前指令指針(PC)啤覆,寄存器集合和堆棧組成苍日。另外,線程是進程中的一個實體窗声,是被系統(tǒng)獨立調(diào)度和分派的基本單位相恃,線程自己不擁有系統(tǒng)資源,只擁有一點兒在運行中必不可少的資源笨觅,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源拦耐。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行见剩。由于線程之間的相互制約杀糯,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒苍苞、阻塞和運行三種基本狀態(tài)固翰。就緒狀態(tài)是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機骂际;運行狀態(tài)是指線程占有處理機正在運行疗琉;阻塞狀態(tài)是指線程在等待一個事件(如某個信號量),邏輯上不可執(zhí)行歉铝。每一個程序都至少有一個線程盈简,若程序只有一個線程,那就是程序本身犯戏。如何使用多線程
1.AsyncTask異步多線程
AsyncTask的規(guī)范型很強送火,能夠時時反映更新的情況
它一般有這么幾個方法
onPreExecute(), 該方法將在執(zhí)行實際的后臺操作前被UI 線程調(diào)用∠确耍可以在該方法中做一些準備工作种吸,如在界面上顯示一個進度條,或者一些控件的實例化呀非,這個方法可以不用實現(xiàn)坚俗。
doInBackground(Params...), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運行在后臺線程中岸裙。這里將主要負責執(zhí)行那些很耗時的后臺處理工作猖败。可以調(diào)用 publishProgress方法來更新實時的任務進度降允。該方法是抽象方法恩闻,子類必須實現(xiàn)。
onProgressUpdate(Progress...),在publishProgress方法被調(diào)用后剧董,UI 線程將調(diào)用這個方法從而在界面上展示任務的進展情況幢尚,例如通過一個進度條進行展示。
onPostExecute(Result), 在doInBackground 執(zhí)行完成后翅楼,onPostExecute 方法將被UI 線程調(diào)用尉剩,后臺的計算結(jié)果將通過該方法傳遞到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("加載完成, 結(jié)果是:" + 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方法中發(fā)送Message,在Handler里管嬉,通過不同的Message執(zhí)行不同的任務皂林。
(Handler的設計實際上是為了應用程序內(nèi)其他線程和主線程進行通信,因為只有主線程才能更新UI宠蚂,其他線程不行)