線程(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 簡介
-
主要函數:
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();
}
}