在操做系統中,安裝了多個程序,併發指的是在一段時間內宏觀上有多個程序同時運行,這在單 CPU 系統中,每一時刻只能有一道程序執行,即微觀上這些程序是分時的交替運行,只不過是給人的感受是同時運行,那是由於分時交替運行的時間是很是短的。服務器
而在多個 CPU 系統中,則這些能夠併發執行的程序即可以分配到多個處理器上(CPU),實現多任務並行執行,即利用每一個處理器來處理一個能夠併發執行的程序,這樣多個程序即可以同時執行。目前電腦市場上說的多核 CPU,即是多核處理器,核 越多,並行處理的程序越多,能大大的提升電腦運行的效率。網絡
單核處理器的計算機確定是不能並行的處理多個任務的,只能是多個任務在單個CPU上併發運行。同理,線程也是同樣的,從宏觀角度上理解線程是並行運行的,可是從微觀角度上分析倒是串行運行的,即一個線程一個線程的去運行,當系統只有一個CPU時,線程會以某種順序執行多個線程,咱們把這種狀況稱之爲線程調度。多線程
操做系統調度的最小任務單位是線程。經常使用的Windows、Linux等操做系統都採用搶佔式多任務,如何調度線程徹底由操做系統決定,程序本身不能決定何時執行,以及執行多長時間。併發
每一個進程都有本身的地址空間,即進程空間,在網絡或多用戶換機下,一個服務器一般須要接收大量不肯定數量用戶的併發請求,爲每個請求都建立一個進程顯然行不通(系統開銷大響應用戶請求效率低),所以操做系統中線程概念被引進。線程的改變只表明CPU的執行過程的改變,而沒有發生進程所擁有的資源的變化。spa
線程執行開銷小,可是不利於資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。進程執行開銷大,可是可以很好的進行資源管理和保護。進程能夠跨機器前移。操作系統
對資源的管理和保護要求高,不限制開銷和效率時,使用多進程。線程
要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程。3d
線程共包括如下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()方法,該線程結束生命週期。對象