Java 多線程基礎(一)基本概念

Java 多線程基礎(一)基本概念

1、併發與並行

一、併發:指兩個或多個事件在同一個時間段發生。

二、並行:指兩個或多個事件在同一時刻發生(同時發生)。

在操做系統中,安裝了多個程序,併發指的是在一段時間內宏觀上有多個程序同時運行,這在單 CPU 系統中,每一時刻只能有一道程序執行,即微觀上這些程序是分時的交替運行,只不過是給人的感受是同時運行,那是由於分時交替運行的時間是很是短的。服務器

而在多個 CPU 系統中,則這些能夠併發執行的程序即可以分配到多個處理器上(CPU),實現多任務並行執行,即利用每一個處理器來處理一個能夠併發執行的程序,這樣多個程序即可以同時執行。目前電腦市場上說的多核 CPU,即是多核處理器,核 越多,並行處理的程序越多,能大大的提升電腦運行的效率。網絡

三、注意點

單核處理器的計算機確定是不能並行的處理多個任務的,只能是多個任務在單個CPU上併發運行。同理,線程也是同樣的,從宏觀角度上理解線程是並行運行的,可是從微觀角度上分析倒是串行運行的,即一個線程一個線程的去運行,當系統只有一個CPU時,線程會以某種順序執行多個線程,咱們把這種狀況稱之爲線程調度。多線程

2、線程與進程

一、進程:是指一個內存中運行的應用程序,每一個進程都有一個獨立的內存空間,一個應用程序能夠同時運行多個進程;進程也是程序的一次執行過程,是系統運行程序的基本單位;系統運行一個程序便是一個進程從建立、運行到消亡的過程。

二、線程:線程是進程中的一個執行單元,負責當前進程中程序的執行,一個進程中至少有一個線程。一個進程中是能夠有多個線程的,這個應用程序也能夠稱之爲多線程程序。

操做系統調度的最小任務單位是線程。經常使用的Windows、Linux等操做系統都採用搶佔式多任務,如何調度線程徹底由操做系統決定,程序本身不能決定何時執行,以及執行多長時間。併發

(一)、線程的產生

每一個進程都有本身的地址空間,即進程空間,在網絡或多用戶換機下,一個服務器一般須要接收大量不肯定數量用戶的併發請求,爲每個請求都建立一個進程顯然行不通(系統開銷大響應用戶請求效率低),所以操做系統中線程概念被引進。線程的改變只表明CPU的執行過程的改變,而沒有發生進程所擁有的資源的變化。spa

  • 線程的執行過程是線性的,儘管中間會發生中斷或者暫停,可是進程所擁有的資源只爲改線狀執行過程服務,一旦發生線程切換,這些資源須要被保護起來。
  • 進程分爲單線程進程和多線程進程,單線程進程宏觀來看也是線性執行過程,微觀上只有單一的執行過程。多線程進程宏觀是線性的,微觀上多個執行操做。

(二)、進程與線程的區別

  • 地址空間。同一線程共享該進程的地址空間;進程之間是獨立的地址空間,
  • 用於資源。同一進程內的線程共享本進程的資源如內存、I/O、cpu等,可是進程之間的資源是獨立的。
  • 執行過程。每一個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。可是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

(三)、優缺點

線程執行開銷小,可是不利於資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。進程執行開銷大,可是可以很好的進行資源管理和保護。進程能夠跨機器前移。操作系統

(四)、使用場景

對資源的管理和保護要求高,不限制開銷和效率時,使用多進程。線程

要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程。3d

3、線程的狀態

線程共包括如下5種狀態,也叫生命週期。
1. 新建狀態(New)         :線程對象被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。
2. 就緒狀態(Runnable):也被稱爲「可執行狀態」。線程對象被建立後,其它線程調用了該對象的start()方法,從而來啓動該線程。例如,thread.start()。處於就緒狀態的線程,隨時可能被CPU調度執行。
3. 運行狀態(Running)   :線程獲取CPU權限進行執行。須要注意的是,線程只能從就緒狀態進入到運行狀態。
4. 阻塞狀態(Blocked)    :阻塞狀態是線程由於某種緣由放棄CPU使用權,暫時中止運行。直到線程進入就緒狀態,纔有機會轉到運行狀態。阻塞的狀況分三種:
    ① 等待阻塞 -- 經過調用線程的wait()方法,讓線程等待某工做的完成。
    ② 同步阻塞 -- 線程在獲取 synchronized 同步鎖失敗(由於鎖被其它線程所佔用),它會進入同步阻塞狀態。
    ③ 其餘阻塞 -- 經過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入就緒狀態。
5. 死亡狀態(Dead)         :線程執行完了或者因異常退出了run()方法,該線程結束生命週期。對象

4、多線程的原理

5、進程、線程實現多任務模式

(一)、多進程模式(一個進程只有一個線程)

(二)、多線程模式(一個進程有多個線程)

(三)、多進程 + 多線程模式(複雜度最高)

相關文章
相關標籤/搜索