## Thread 相關(guān)知識點整理
1,Thread的作用芳来,Process和Thread的區(qū)別
2暴氏,Thread的創(chuàng)建方式
3,Thread的wait绣张,sleep的使用及Thread的終止方法
#### 一,Thread 的作用
1)開發(fā)中关带,進程會處理一些侥涵,耗時的操作沼撕,比如文件的下載等,使用時芜飘,我們都會創(chuàng)建一個Thread务豺,把任務(wù)放在Thread中執(zhí)行,可以簡單認為Thread為耗時任務(wù)的執(zhí)行者嗦明,
2)Android 中笼沥,一個應(yīng)用就是一個獨立的進程,當(dāng)然四大組件都可以在AndroidMainfirst.xml文件中注冊時添加process的屬性設(shè)置獨立的進程娶牌,這里不做主要講述奔浅。
線程和進程根本區(qū)別:進程是操作系統(tǒng)資源分配的執(zhí)行單元,而線程是任務(wù)調(diào)度和執(zhí)行的基本單元诗良。
每個進程都有獨立的代碼和數(shù)據(jù)空間汹桦,每個線程都有自己獨立的運行棧和程序計數(shù)器,同一類線程共享代碼和數(shù)據(jù)空間鉴裹,同一個進程中可以包含多個線程同時執(zhí)行舞骆。
#### 二,Thread的創(chuàng)建方法
1)通過繼承Thread實現(xiàn)
class NewThread extends Thread{
????public void run(){? //任務(wù)的執(zhí)行}
? ?}
啟動線程:new NewThread().start();
2)實現(xiàn)Runnable接口
class NewRunnable implements Runnable{
? ? ? ? public void run(){//任務(wù)的執(zhí)行}
}
啟動方式:
NewRunnable mRunnable=new NewRunnable();
new Thread(mRunnable).start();
主要區(qū)別:
繼承Thread類實現(xiàn)的多線程要求放入多線程中的類不能繼承其他類径荔,而實現(xiàn)Runnable接口的類可以防在多個線程中執(zhí)行督禽,多個線程可以去執(zhí)行同一資源,而繼承Thread類只能實現(xiàn)多個線程分別去處理自己的資源总处。
#### 線程中Wait狈惫,Sleep的使用及線程的終止
代碼源于生活,生活中辨泳,我們總是會遇到很多情況下虱岂,我們正在做某一件事時,總是會有一些事情或者情況的發(fā)生讓我需要暫筒ず欤或者休息一下第岖,過一會再繼續(xù)做當(dāng)前的事情,Thread的使用也是如此试溯,當(dāng)有優(yōu)先級比較高的任務(wù)和特殊情況發(fā)生時蔑滓,,我們需要讓當(dāng)前Thread暫停執(zhí)行遇绞,1)這就用到了Wait键袱,和Sleep。
具體使用如下:
```
public class Demo{
? ? final static Object person =new Object();
? ? public static class T1 extends Thread{
? ? ? ? public void run(){
? ? ? ? ? ? synchronized (person){
? ? ? ? ? ? ? ? System.out.println(System.currentTimeMillis()+"T1 come");
? ? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? ? System.out.println(System.currentTimeMillis()+"T1 wait");
? ? ? ? ? ? ? ? ? ? person.wait();
? ? ? ? ? ? ? ? }catch (InterruptedException r){
? ? ? ? ? ? ? ? ? ? r.getStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? System.out.println(System.currentTimeMillis()+"T1 over");
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? public static class T2 extends Thread{
? ? ? ? public void run(){
? ? ? ? ? ? synchronized (person){
? ? ? ? ? ? ? ? System.out.println(System.currentTimeMillis()+"T2 come");
? ? ? ? ? ? ? ? person.notify();
? ? ? ? ? ? ? ? System.out.println(System.currentTimeMillis()+"T2 over");
? ? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? ? Thread.sleep(2000);
? ? ? ? ? ? ? ? }catch (InterruptedException r){
? ? ? ? ? ? ? ? ? ? r.getStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? public static void main(String args[]){
? ? ? ? try{
? ? ? ? ? ? Thread thread1=new T1();
? ? ? ? ? ? Thread thread2=new T2();
? ? ? ? ? ? thread1.start();
? ? ? ? ? ? thread2.start();
? ? ? ? }catch (Exception e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}
```
這里從別處借鑒過來的代碼摹闽,
Wait是Object類提供的方法,當(dāng)對象調(diào)用wait方法后蹄咖,會導(dǎo)致本地線程放棄對象鎖,進入等待此對象的等待鎖定池中付鹿,只有此對象發(fā)送notify方法或notifyAll方法后當(dāng)前線程才進入對象鎖定池準(zhǔn)備獲得對象鎖進入運行澜汤。
Sleep是Thread類提供的方法蚜迅,使用時會使當(dāng)前線程進入阻塞狀態(tài),在指定時間內(nèi)不會執(zhí)行俊抵,把執(zhí)行機會讓給其他線程谁不,但監(jiān)控狀態(tài)依然保持,到時會自動恢復(fù)徽诲,不會釋放鎖對象刹帕。
Sleep可以在任何地方使用,但必須捕獲異常谎替,而wait偷溺,nofity和notifyAll不需要捕獲異常,Sleep是一個靜態(tài)方法院喜,只對當(dāng)前對象有限亡蓉。
2)線程的終止方法
I,通過聲明一個Volatile 的標(biāo)示位變量停止
II喷舀,通過調(diào)用Thread類的Stop方法強制停止砍濒,不建議使用
III,使用Thread類提供的interrupt方法來中斷線程