線程/Handle詳解

線程(Thread)簡介

  • Thread主要函數

run()// 包含線程運行時所執行的代碼
start()// 用于啟動線程
sleep()/sleep(long millis)// 線程休眠,交出CPU,讓CPU去執行其他的任務,然后線程進入阻塞狀態,sleep方法不會釋放鎖
yield()// 使當前線程交出CPU,讓CPU去執行其他的任務,但不會是線程進入阻塞狀態,而是重置為就緒狀態,yield方法不會釋放鎖
join()/join(long millis)/join(long millis,int nanoseconds)// 等待線程終止,直白的說 就是發起該子線程的線程 只有等待該子線程運行結束才能繼續往下運行
wait()// 交出cpu,讓CPU去執行其他的任務,讓線程進入阻塞狀態,同時也會釋放鎖
interrupt()// 中斷線程,自stop函數過時之后,我們通過interrupt方法和isInterrupted()方法來停止正在運行的線程,注意只能中斷已經處于阻塞的線程
getId()// 獲取當前線程的ID
getName()/setName()// 獲取和設置線程的名字
getPriority()/setPriority()// 獲取和這是線程的優先級 一般property用1-10的整數表示,默認優先級是5,優先級最高是10,優先級高的線程被執行的機率高
setDaemon()/isDaemo()// 設置和判斷是否是守護線程
currentThread()// 靜態函數獲取當前線程

  • Thread線程主要狀態

    ( 1)New一旦被實例化之后就處于new狀態
    ( 2)Runnable調用了start函數之后就處于Runnable狀態
    ( 3)Running線程被cpu執行 調用run函數之后 就處于Running狀態
    ( 4 ) Blocked調用join()、sleep()、wait()使線程處于Blocked狀態
    ( 5 ) Dead線程的run()方法運行完畢或被中斷或被異常退出,線程將會到達Dead狀態

Handle 簡介

Handle內部解析

  • 主要函數:

    sendMessage()可以延伸的方法
    sendMessageAtTime(Message msg, long uptimeMillis)在指定時間uptimeMillis時發送消息msg;
    sendMessageDelayed(Message msg, long delayMillis)延遲delayMillis時間后發送消息msg
    **sendEmptyMessage(int what) **發送一個指定類型what的空消息;
    sendEmptyMessageAtTime(int what, long uptimeMillis)在指定時間uptimeMillis時發送一條指定類型what的空消息;
    sendEmptyMessageDelayed(int what, long delayMillis)延遲delayMillis時間后發送一條指定類型what的空消息;
    sendMessageAtFrontOfQueue(Message msg)在消息隊列頭(優先)發送這條消息msg;
    同樣,post()可以延伸的方法
    postAtTime(Runnable r, long uptimeMillis)
    postAtTime(Runnable r, Object token, long uptimeMillis)
    postDelayed(Runnable r, long delayMillis)
    postAtFrontOfQueue(Runnable r)
    請自行查閱相應方法,這里不予一一列出。

實際用法

1,首先第一種啟用方法是通過繼承Thread類,并改寫run方法來實現一個線程

public classMyThreadextendsThread {

//繼承Thread類,并改寫其run方法

private final staticStringTAG="My Thread ===> ";

public voidrun(){

Log.d(TAG,"run");

for(inti =0; i<100; i++)

{

Log.e(TAG, Thread.currentThread().getName() +"i =  "+ i);

}

}

}

啟動

newMyThread().start();

2,第二種啟用方式創建一個Runnable對象

public classMyRunnableimplementsRunnable{

private final staticStringTAG="My Runnable ===> ";

@Override

public voidrun() {

//TODO Auto-generated method stub

Log.d(TAG,"run");

for(inti =0; i<1000; i++)

{

Log.e(TAG, Thread.currentThread().getName() +"i =  "+ i);

}

}

}

啟動

newThread(new MyRunnable()).start();

3, 第三種啟用方式通過Handler啟動線程

public classMainActivityextendsActivity {

private final staticStringTAG="UOfly Android Thread ==>";

private intcount=0;

privateHandlermHandler=newHandler();

privateRunnablemRunnable=newRunnable() {

public voidrun() {

Log.e(TAG, Thread.currentThread().getName() +" "+count);

count++;

setTitle(""+count);

//每3秒執行一次

mHandler.postDelayed(mRunnable,3000);//給自己發送消息,自運行

}

};

/** Called when the activity is first created. */

@Override

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//通過Handler啟動線程

mHandler.post(mRunnable);//發送消息,啟動線程運行

}

@Override

protected voidonDestroy() {

//將線程銷毀掉

mHandler.removeCallbacks(mRunnable);

super.onDestroy();

}

}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容