併發編程之多線程概念

進程和線程html

  說到多線程,必然繞不開進程與線程的概念及區別。編程

  對於計算機而言,當前的操做系統能夠同時運行多個應用程序,而每個應用程序就是一個進程(Process),它擁有本身獨立的內存空間。線程是進程中的一個執行流程,是執行任務的最小單位。一個進程內部容許同時啓動多個線程(Thread),同時執行多個任務。線程是輕量級的進程,它負責在單個程序裏執行多任務,一般由操做系統負責多個線程的調度和執行。 多線程

  進程與線程的主要區別在於:每一個進程都須要操做系統爲其分配獨立的內存空間,而同一個進程中的全部線程在同一塊地址空間中,這些線程能夠共享數據。【每一個進程都擁有本身的一套變量,而線程能夠共享數據】 
 
多線程
 
  多線程是併發編程的基礎。
 
  多線程的好處在於能夠同時併發執行多個任務。當程序的某個功能部分正在等待資源而又不肯意由於等待而形成程序暫停,就能夠建立另外的線程進行它的工做。
 
  多線程能夠最大限度地下降CPU的閒置時間,從而提升CPU的利用率。
 
主存與工做內存
 
  多線程將內存抽象爲兩類:主內存和工做內存。主內存,簡稱主存,是全部線程共享的內存,主要存放共享的變量(即:類變量)。工做內存是Java線程的本地內存,是單獨給每個線程分配的特有的工做內存,用來存放局部變量和共享變量的副本。
 
  既然主內存已經存有共享變量,爲什麼還有在工做內存中存放共享變量的副本呢?緣由在於線程與主存之間的通訊效率比較低,頻繁的通訊會下降系統性能。當線程進行讀寫操做時,只須要對工做內存中的變量進行操做。【關於主存和工做內存請查看 併發編程之Java內存模型
 
 線程的生命週期
 
  從JDK的源碼(sun.misc.VM#toThreadState)中,咱們能夠看出,線程的生命週期分爲6個狀態:NEW(新建立)、RUNNANLE(可運行)、BLOCKED(被阻塞)、WAITING(等待)、TIMED_WAITING(計時等待)、TERMINATED(中終止).
/**
* A thread state.  A thread can be in one of the following states:
* <ul>
* <li>{@link #NEW}
*     A thread that has not yet started is in this state.
* </li>
* <li>{@link #RUNNABLE}
*     A thread executing in the Java virtual machine is in this state.
*</li>
* <li>{@link #BLOCKED}
*     A thread that is blocked waiting for a monitor lock
*     is in this state.
* </li>
* <li>{@link #WAITING}
*     A thread that is waiting indefinitely for another thread to
*     perform a particular action is in this state.
* </li>
* <li>{@link #TIMED_WAITING}
*     A thread that is waiting for another thread to perform an action
*     for up to a specified waiting time is in this state.
* </li>
* <li>{@link #TERMINATED}
*     A thread that has exited is in this state.
* </li>
* </ul>
*
* <p>
* A thread can be in only one state at a given point in time.
* These states are virtual machine states which do not reflect
* any operating system thread states.
*
* @since   1.5
* @see #getState
*/

public static State toThreadState(int var0) {
    if ((var0 & 4) != 0) {
        return State.RUNNABLE;
    } else if ((var0 & 1024) != 0) {
        return State.BLOCKED;
    } else if ((var0 & 16) != 0) {
        return State.WAITING;
    } else if ((var0 & 32) != 0) {
        return State.TIMED_WAITING;
    } else if ((var0 & 2) != 0) {
        return State.TERMINATED;
    } else {
        return (var0 & 1) == 0 ? State.NEW : State.RUNNABLE;
    }
}

 

  線程狀態之間的轉換關係以下圖:併發

                

 

  • 剛建立的線程處於NEW狀態
  • 調用start()後,線程處於RUNNANLE狀態【線程什麼時候開始執行任務,受CPU的控制。當CPU有空閒資源時,纔會運行線程】
  • 在等待獲取鎖資源的時候,線程會處於BLOCKED狀態
  • 線程在等待另外一個線程的通知時,會處於WAITING狀態
  • 線程在指定時間內等待另外一個線程通知,會處於TIMED_WAITING狀態
  • 線程運行結束或出現異常,就會變爲TERMINATED狀態
  • 獲取線程的當前狀態:getState()
public Thread.State getState() {
    return VM.toThreadState(this.threadStatus);
}

 

  從源碼中能夠看出,線程的狀態與VM有很大的關係。在JVM中,與線程建立、運行、銷燬等關係比較大的是Java虛擬機棧內存。【JVM的基本機構可查看JVM之基本結構性能

相關文章
相關標籤/搜索