多線程的概念

 原文地址:

http://software.intel.com/zh-cn/blogs/2011/12/02/400009295/?cid=sw:prccsdn2087

一、程序與進程

1、程序:一段靜態的代碼。

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

3、進程也稱任務,支持多個進程同時執行的OS就被稱爲多進程OS或多任務OS。

二、進程與線程

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

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

特點:線程不能獨立運行,必須依賴於進程,在進程中運行。

每個程序至少有一個線程稱爲主線程。

單線程:只有一條線程的進程稱爲單線程

多線程:有不止一個線程的進程稱爲多線程

三、開啓多線程的優點和缺點

提高界面程序響應速度。通過使用線程,可以將需要大量時間完成的流程在後臺啓動單獨的線程完成,提高前臺界面的相應速度。

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

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

13.2 多線程實現

一、在實現線程編程時,首先需要讓一個類具備多線程的能力,繼承Thread類或實現Runnable接口的類具備多線程的能力,然後創建線程對象,調用對應的啓動線程方法即可實現線程編程。

在一個程序中可以實現多個線程,多線程編程指在同一個程序中啓動了兩個或兩個以上的線程。

在實際實現線程時,Java語言提供了三種實現方式:

(1)繼承Thread類

(2)實現Runnable接口

(3)使用Timer和TimerTask組合

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

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接口的方式實現多線程。

class MyThread2 implements Runable{

public void run(){} //重寫Runable接口中的run()方法

}

MyThread2 mt1=new MyThread2();

Thread t1=new Thread(mt1);

t1.start();

13.3 線程的生命週期

一、線程的生命週期

線程是一個動態執行的過程,它也有一個從產生到死亡的過程,這就是所謂的生命週期。一個線程在它的生命週期內有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()方法恢復)

發佈了13 篇原創文章 · 獲贊 28 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章