1、 進程與線程 java
在談論線程以前,咱們先來看看什麼叫進程,以及進程與線程的關係。 linux
進程 windows
咱們在windows操做系統中打開任務管理器,能夠看到有一項是「進程」,裏面列舉出了用戶目前正在運行的全部進程,包括系統進程和用戶應用程序進程,以及每一個進程所佔用的內存資源等信息。進程是操做系統結構的基礎,它不只只包括運行的程序代碼,還包括當前的活動。對於每個進程,操做系統都會爲其分配一個獨立的內存塊,各進程間資源是不共享的。 多線程
劃分時間片,宏觀上並行,微觀上串行 併發
線程 操作系統
一個Java程序運行以後,就會啓動一個JVM實例進程,這個進程就負責處理這個程序全部的操做,直到程序結束,進程也隨之結束。 線程
而線程就是再在進程的內部將CPU資源進行再次劃分,以知足同時處理多條語句的須要(微觀上,其實也是並行執行的),這些線程在進程內部的資源是共享的(正因如此,纔會有同步以及鎖的出現)。 htm
JVM進程啓動必定會有一個主線程存在,即main方法啓動的線程,這個線程是Java程序的入口,咱們能夠在main方法內部在定義咱們本身的線程,這樣就能夠實現多線程了。 對象
2、 Java多線程的實現方式 繼承
java.lang.Thread類的一個對象就表明一個線程
線程是底層OS(操做系統)維護的資源,JVM跑在OS上,在JVM中建立一個Thread對象,調用其start()方法,底層OS會申請一個線程資源,線程對象可到底層管理一個線程,建立好線程以後,把要讓線程執行的代碼封裝到線程對象中(覆蓋run()方法)。
實現線程代碼的方式:
一、繼承Thread類,覆蓋run()方法
去底層申請線程並運行,對線程對象調start()方法,main方法是一個主線程
宏觀並行,微觀串行
二、實現Runnable接口
使用多態得到Runnable對象,成爲目標對象
再利用目標對象構造線程對象Thread t = new Thread(target);//target爲Runnable接口類型
對於中兩種方法的具體介紹能夠參考 http://www.linuxidc.com/Linux/2013-12/93690.htm
3、 線程的優先級
線程的優先級是從0-10的整數,0表示最低,5表示普通,10表示最大;JVM會自動將java線程的優先級轉換爲操做系統的優先級。
main線程的優先級是5。
4、 線程的狀態
下面爲線程中的7個很是重要的狀態(有的書上也只有認爲前五種狀態:而將「鎖池」和「等待池」都當作是「阻塞」狀態的特殊狀況:這種認識也是正確的,可是將「鎖池」和「等待池」單獨分離出來有利於對程序的理解):
一、 初始狀態:線程剛建立(Thread th = new Thread(target);)
二、 可運行狀態:線程建立以後調用它的start()方法,此時線程狀態就變動爲可運行狀態,但必定就會當即運行,須要等待得到CPU。
三、 運行狀態:調用線程的start()方法以後,線程就會進入等待運行狀態(可運行狀態),此時一旦該線程得到CPU的使用權,縣城就會當即進入運行狀態,即執行線程的run()方法。
四、 阻塞狀態:線程失去CPU的使用權,進入一種等待狀態,注意不是可運行狀態。有如下三種狀況會使線程進入阻塞狀態:
(1) 等待外部設備輸入:如等待鍵盤輸入,則該線程會進入阻塞狀態直到輸入完畢,注意:阻塞結束以後是進入可運行狀態,而不是運行狀態。
(2) 線程休眠,即調用線程的sleep()方法。Sleep()方法有一個參數,表示休眠的時間,當線程休眠的時間到達指定時間後,線程會自動結束阻塞狀態而進入可運行狀態,等待CPU。
(3) 一個線程調用另外一個線程的join()方法,join()方法指的是調用該方法的線程將進入阻塞狀態直到被調用join()方法的線程運行結束以後,纔會進入可運行狀態。
例:在t2線程的run()方法內部有這樣一句代碼t1.join();(t1是一個線程對象),這將意味着黨線程t2執行到該語句時就會調用線程t1的join()方法,從而t2進入阻塞狀態,直到t1運行結束爲止。
五、 終止狀態:即線程執行結束
六、 鎖池狀態
七、 等待隊列
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-12/93691p2.htm
相關閱讀:
Java Hashtable多線程操做遍歷問題 http://www.linuxidc.com/Linux/2013-01/78574.htm
Java多線程順序執行 http://www.linuxidc.com/Linux/2012-07/65033.htm
Java多線程問題之同步器CyclicBarrier http://www.linuxidc.com/Linux/2012-07/64593.htm
Java多線程之wait()和notify() http://www.linuxidc.com/Linux/2012-03/57067.htm
Java多線程之synchronized http://www.linuxidc.com/Linux/2012-03/57068.htm
Java多線程之併發鎖 http://www.linuxidc.com/Linux/2012-03/57069.htm