1. 程式人生 > >對於執行緒的理解

對於執行緒的理解

一、程式與程序

1、程式:一段靜態的程式碼。

2、程序:程式的一次動態執行過程,它對應從程式碼載入、執行到執行完畢的一個完整過程。

3、程序也稱任務,支援多個程序同時執行的OS就被稱為多程序OS或多工OS。

二、程序與執行緒

在一個程式內部也可以實現多個任務併發執行,其中每個任務稱為執行緒。

執行緒是比程序更小的執行單位,它是在一個程序中獨立的控制流,即程式內部的控制流。

特點:執行緒不能獨立執行,必須依賴於程序,在程序中執行。

每個程式至少有一個執行緒稱為主執行緒。

單執行緒:只有一條執行緒的程序稱為單執行緒

多執行緒:有不止一個執行緒的程序稱為多執行緒

三、開啟多執行緒的優點和缺點

提高介面程式響應速度。通過使用執行緒,可以將需要大量時間完成的流程在後臺啟動單獨的執行緒完成,提高前臺介面的相應速度。

充分利用系統資源,提高效率。通過在一個程式內部同時執行多個流程,可以充分利用CPU等系統資源,從而最大限度的發揮硬體的效能。

當程式中的執行緒數量比較多時,系統將花費大量的時間進行執行緒的切換,這反而會降低程式的執行效率。但是,相對於優勢來說,劣勢還是很有限的,所以現在的專案開發中,多執行緒程式設計技術得到了廣泛的應用。

多執行緒實現一、在實現執行緒程式設計時,首先需要讓一個類具備多執行緒的能力,繼承Thread類或實現Runnable介面的類具備多執行緒的能力,然後建立執行緒物件,呼叫對應的啟動執行緒方法即可實現執行緒程式設計。

在一個程式中可以實現多個執行緒,多執行緒程式設計指在同一個程式中啟動了兩個或兩個以上的執行緒。

在實際實現執行緒時,Java語言提供了三種實現方式:

(1)繼承Thread類

(2)實現Runnable介面

(3)使用Timer和TimerTask組合

二、繼承Thread執行緒類實現多執行緒java.lang包中提供了一個專門的執行緒類(Thread),在該類中封裝了許多對執行緒進行排程和處理的方法。如果一個類繼承了Thread類,則該類就具備了多執行緒的能力,可以多執行緒的方式執行。

?12345678910111213141516171819202122232425262728293031 class MyThread extends 
Thread{    public void run(){    //執行緒體    }    }    繼承Thread類實現多執行緒。    MyThread 
tt1 = new MyThread ();    //啟動執行緒    tt1.start();    try{    for(int i = 0;i < 
5;i++){    //延時1秒    Thread.sleep(1000);    System.out.println("Main:" + i);    
}    }catch(Exception e){}

注意:

執行緒的特性:隨機性,系統在執行多執行緒程式時只保證執行緒是交替執行的,至於哪個執行緒先執行哪個執行緒後執行,則無法獲得保證,需要書寫專門的程式碼才可以保證執行的順序。

對於同一個執行緒類,也可以啟動多個執行緒

同一個執行緒不能啟動兩次,

當自定義執行緒中的run方法執行完成以後,則自定義執行緒自然死亡。而對於系統執行緒來說,只有當main方法執行結束,而且啟動的其它執行緒都結束以後,才會結束。當系統執行緒執行結束以後,程式的執行才真正結束。

三、 實現Runable介面

a) 多執行緒物件實現java.lang.Runnable介面並且在該類中重寫Runnable介面的run方法。

b) 好處:實現Runable介面的方法避免了單繼承的侷限性。

例1:使用實現Runable介面的方式實現多執行緒。

?1234567891011 class MyThread2 implements Runable{    public void run(){} 
//重寫Runable介面中的run()方法    }    MyThread2 mt1=new MyThread2();    Thread t1=new 
Thread(mt1);    t1.start();

執行緒的生命週期一、執行緒的生命週期

執行緒是一個動態執行的過程,它也有一個從產生到死亡的過程,這就是所謂的生命週期。一個執行緒在它的生命週期內有5種狀態:

1、新建(new Thread)

當建立Thread類的一個例項(物件)時,此執行緒進入新建狀態(未被啟動)。例如:Thread t1=new Thread();

2、就緒(runnable)

執行緒已經被啟動,正在等待被分配給CPU時間片,也就是說此時執行緒正在就緒佇列中排隊等候得到CPU資源。例如:t1.start();

3、執行(running)

執行緒獲得CPU資源正在執行任務(run()方法),此時除非此執行緒自動放棄CPU資源或者有優先順序更高的執行緒進入,執行緒將一直執行到結束。

4、死亡(dead)

當執行緒執行完畢或被其它執行緒殺死,執行緒就進入死亡狀態,這時執行緒不可能再進入就緒狀態等待執行。

自然終止:正常執行run()方法後終止

異常終止:呼叫stop()方法讓一個執行緒終止執行

5、堵塞(blocked)

由於某種原因導致正在執行的執行緒讓出CPU並暫停自己的執行,即進入堵塞狀態。

正在睡眠:用sleep(long t) 方法可使執行緒進入睡眠方式。一個睡眠著的執行緒在指定的時間過去可進入就緒狀態。

正在等待:呼叫wait()方法。(呼叫motify()方法回到就緒狀態)

被另一個執行緒所阻塞:呼叫suspend()方法。(呼叫resume()方法恢復)