Java多線程編程要點 (一)

一、 認識Thread和Runnablehtml

Java中實現多線程有兩種途徑:繼承Thread類或者實現Runnable接口。Runnable是接口,建議用接口的方式生成線程,由於接口能夠實現多繼承,何況Runnable只有一個run方法,很適合繼承。在使用Thread的時候只需繼承Thread,而且new一個實例出來,調用start()方法便可以啓動一個線程。java

Thread Test = new Thread();安全

Test.start();多線程

在使用Runnable的時候須要先new一個實現Runnable的實例,以後啓動Thread便可。spa

Test impelements Runnable;操作系統

Test t = new Test();線程

Thread test = new Thread(t);htm

test.start();對象

總結:Thread和Runnable是實現java多線程的2種方式,runable是接口,thread是類,建議使用runable實現java多線程,無論如何,最終都須要經過thread.start()來使線程處於可運行狀態。blog

二、 認識Thread的start和run

1) start:

用start方法來啓動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。經過調用Thread類的start()方法來啓動一個線程,這時此線程處於就緒(可運行)狀態,並無運行,一旦獲得spu時間片,就開始執行run()方法,這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

2) run:

run()方法只是類的一個普通方法而已,若是直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑仍是隻有一條,仍是要順序執行,仍是要等待run方法體執行完畢後纔可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。

總結:調用start方法方可啓動線程,而run方法只是thread的一個普通方法調用,仍是在主線程裏執行。

三、 線程狀態說明

線程狀態從大的方面來講,可歸結爲:初始狀態、可運行狀態、不可運行狀態和消亡狀態,具體可細分爲上圖所示7個狀態,說明以下:

1) 線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但無論怎樣,當咱們new了thread實例後,線程就進入了初始狀態;

2) 當該對象調用了start()方法,就進入可運行狀態;

3) 進入可運行狀態後,當該對象被操做系統選中,得到CPU時間片就會進入運行狀態;

4) 進入運行狀態後case就比較多,大體有以下情形:

?run()方法或main()方法結束後,線程就進入終止狀態;

?當線程調用了自身的sleep()方法或其餘線程的join()方法,就會進入阻塞狀態(該狀態既中止當前線程,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該線程進入可運行狀態,繼續等待OS分配時間片;

?當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖牢(synchroniza,lock),將會當即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裏也許已經有了其餘線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程得到鎖標記後,就轉入可運行狀態,等待OS分配CPU時間片;

?當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所佔有的全部資源,與阻塞狀態不一樣),進入這個狀態後,是不能自動喚醒的,必須依靠其餘線程調用notify()或notifyAll()方法才能被喚醒(因爲notify()只是喚醒一個線程,但咱們由不能肯定具體喚醒的是哪個線程,也許咱們須要喚醒的線程不可以被喚醒,所以在實際使用時,通常都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池,等待獲取鎖標記。

?當線程調用stop方法,便可使線程進入消亡狀態,可是因爲stop方法是不安全的,不鼓勵使用,你們能夠經過run方法裏的條件變通實現線程的stop

原文地址:http://software.intel.com/zh-cn/blogs/2010/03/19/java-3/?cid=sw:prccsdn1009

閱讀全文
類別:Java 查看評論

相關文章
相關標籤/搜索