java高併發系列 - 第5天:深刻理解進程和線程

進程

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。程序是指令、數據及其組織形式的描述,進程是程序的實體。java

進程具備的特徵:windows

  • 動態性:進程是程序的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的
  • 併發性:任何進程均可以同其餘進行一塊兒併發執行
  • 獨立性:進程是系統進行資源分配和調度的一個獨立單位
  • 結構性:進程由程序,數據和進程控制塊三部分組成

咱們常用windows系統,常常會看見.exe後綴的文件,雙擊這個.exe文件的時候,這個文件中的指令就會被系統加載,那麼咱們就能獲得一個關於這個.exe程序的進程。進程是「活」的,或者說是正在被執行的。多線程

window中打開任務管理器,能夠看到當前系統中正在運行的進程,以下圖:併發

線程

線程是輕量級的進程,是程序執行的最小單元,使用多線程而不是多進程去進行併發程序的設計,是由於線程間的切換和調度的成本遠遠小於進程。高併發

咱們用一張圖來看一下線程的狀態圖:操作系統

線程的全部狀態在java.lang.Thread中的State枚舉中有定義,如:線程

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

線程幾個狀態的介紹:設計

  • New:表示剛剛建立的線程,這種線程尚未開始執行
  • RUNNABLE:運行狀態,線程的start()方法調用後,線程會處於這種狀態
  • BLOCKED:阻塞狀態。當線程在執行的過程當中遇到了synchronized同步塊,但這個同步塊被其餘線程已獲取還未釋放時,當前線程將進入阻塞狀態,會暫停執行,直到獲取到鎖。當線程獲取到鎖以後,又會進入到運行狀態(RUNNABLE)
  • WAITING:等待狀態。和TIME_WAITING都表示等待狀態,區別是WAITING會進入一個無時間限制的等,而TIME_WAITING會進入一個有限的時間等待,那麼等待的線程究竟在等什麼呢?通常來講,WAITING的線程正式在等待一些特殊的事件,好比,經過wait()方法等待的線程在等待notify()方法,而經過join()方法等待的線程則會等待目標線程的終止。一旦等到指望的事件,線程就會再次進入RUNNABLE運行狀態。
  • TERMINATED:表示結束狀態,線程執行完畢以後進入結束狀態。

注意:從NEW狀態出發後,線程不能在回到NEW狀態,同理,處理TERMINATED狀態的線程也不能在回到RUNNABLE狀態3d

進程與線程的一個簡單解釋

進程(process)和線程(thread)是操做系統的基本概念,可是它們比較抽象,不容易掌握。code

1.計算機的核心是CPU,它承擔了全部的計算任務。它就像一座工廠,時刻在運行。

2.假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其餘車間都必須停工。背後的含義就是,單個CPU一次只能運行一個任務。

3.進程就比如工廠的車間,它表明CPU所能處理的單個任務。任一時刻,CPU老是運行一個進程,其餘進程處於非運行狀態。

4.一個車間裏,能夠有不少工人。他們協同完成一個任務。

5.線程就比如車間裏的工人。一個進程能夠包括多個線程。

6.車間的空間是工人們共享的,好比許多房間是每一個工人均可以進出的。這象徵一個進程的內存空間是共享的,每一個線程均可以使用這些共享內存。

7.但是,每間房間的大小不一樣,有些房間最多隻能容納一我的,好比廁所。裏面有人的時候,其餘人就不能進去了。這表明一個線程使用某些共享內存時,其餘線程必須等它結束,才能使用這一塊內存。

8.一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫"互斥鎖"(Mutual exclusion,縮寫 Mutex),防止多個線程同時讀寫某一塊內存區域。

9.還有些房間,能夠同時容納n我的,好比廚房。也就是說,若是人數大於n,多出來的人只能在外面等着。這比如某些內存區域,只能供給固定數目的線程使用。

10.這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。後到的人發現鑰匙架空了,就知道必須在門口排隊等着了。這種作法叫作"信號量"(Semaphore),用來保證多個線程不會互相沖突。

11.操做系統的設計,所以能夠歸結爲三點:
(1)以多進程形式,容許多個任務同時運行;
(2)以多線程形式,容許單個任務分紅不一樣的部分運行;
(3)提供協調機制,一方面防止進程之間和線程之間產生衝突,另外一方面容許進程之間和線程之間共享資源。

java高併發系列交流羣

相關文章
相關標籤/搜索