舉例說明進程:html
(1)想象一位有一手好廚藝的計算機科學家正在爲他的女兒烘焙生日蛋糕; (2)他有作生日蛋糕的食譜,廚房裏有所須要的原料:麪粉、雞蛋、糖等。 (3)在這個比喻中,作蛋糕的食譜就是程序; (4)計算機科學家就是處理器cpu; (5)而作蛋糕的各類原料就是輸入數據。 (6)進程就是廚師閱讀食譜、取來各類原料、以及烘焙蛋糕等一系列動做的總和。 (7)如今假設計算機科學家的兒子哭着跑來出來,說他的頭被一隻蜜蜂蟄了; (8)計算機科學家就記錄下他照着食譜作到了哪兒了,也就是保存進程的當前狀態; (9)而後拿出一本急救手冊,按照其中的指示處理蟄傷; (10)這時咱們就看處處理器從一個進程切換到另外一個高優先級的進程; (11)每一個進程擁有各自的程序(食譜和急救手冊); (12)當蜜蜂蟄傷被處理完成以後,這位計算機科學家又回來作蛋糕; (13)從他離開時的那一步繼續進行下去。
舉例說明線程:java
(1)假設一個文本程序,須要接收鍵盤輸入,將內容顯示在屏幕上,還須要保存信息到硬盤中。 (2)若只有一個進程,勢必形成同一時間只能幹一件事的尷尬,就是說當保存時,不能鍵盤輸入; (3)如有多個進程,每一個進程負責一個任務; (4)進程A負責鍵盤輸入,進程B負責將內容顯示在屏幕上,進程C負責保存內容到硬盤中; (5)這裏A、B、C間的協做涉及到了進程通訊問題,並且它們有共同都須要的內容:文本內容; (6)不停的切換會形成性能上的損失。 (7)如有一種機制,可使A、B、C能夠共享資源; (8)這樣上下文切換所須要保存和恢復的內容就少了; (9)同時也能夠減小通訊所帶來的性能損耗。 (10)這種機制,就是線程。
進程與線程的關係:session
(1)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程 (2)資源分配給進程,同一進程的全部線程共享該進程的全部資源 (3)cpu分給線程,即真正在cpu上運行的是線程
jvm啓動是多線程的:多線程
(1)由於在jvm啓動的時候垃圾回收線程也要啓動,不然很容易會出現內存溢出; (2)如今的垃圾回收線程加上前面的主線程,最少啓動了兩個線程,因此,jvm的啓動是多線程的。
注意:併發
(1)就緒狀態是進入到運行狀態的惟一入口 (2)線程想要進入到運行狀態執行,首先必須處於就緒狀態中 (3)根據阻塞產生的緣由,阻塞狀態又能夠分爲三種: 【1】等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態 【2】同步阻塞:線程在獲取synchronized同步鎖失敗(由於鎖被其餘線程佔用),它會進入同步阻塞狀態 【3】其餘阻塞:經過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入就緒狀態
monitor:jvm
(1)是應用於同步問題的人工線程調度工具 (2)java的每一個對象都有一個監視器,來監測併發代碼的重入。 (3)在非多線程編碼時該監視器不發揮做用,反之若是在synchronized範圍內,監視器發揮做用
ThreadLocal類:工具
(1)用於保存線程的對立變量 (2)當使用ThreadLocal維護變量時,ThreadLocal爲每一個使用該變量的線程提供獨立的變量副本,因此每個線程均可以獨立的改變本身的副本,而不會影響其餘線程所對應的副本。 (3)經常使用與用戶登錄控制,如記錄session信息。