Java多線程和同步的理解

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

相關文章
相關標籤/搜索