Java併發基礎(1)------Thread

建立Thread的方法:

  • 經過繼承Thread類
  • 實現runnable接口
  • 使用線程池
  • 實現callable接口(call方法能夠有返回值,能夠拋出異常)

實現線程的經常使用的方法有以上幾種,在選擇實現線程的方法要注意如下幾點:java

  1. 若是要extend其餘類的時候,建議使用除繼承Thread類外方法,由於java不支持多繼承
  2. 若是須要有返回值,能夠實現callable接口
  3. 使用線程池建立線程能夠避免因頻繁的建立和銷燬線程損耗系統的性能

Thread的生命週期

(1)生命週期設計模式

NEW (新建)函數

RUNNABLE(可運行)源碼分析

RUNNING (運行)性能

BLOCKED (阻塞)線程

TERMINATED(中斷)設計

(2)轉化過程圖示:3d

(3)注意點:cdn

  • 使用 new 建立一個Thread 對象中,此時它並不處在執行狀態,在沒有執行Thread.start()方法前,只是一個普通的Thread對象,經過start進入RUNNABLE狀態,這時候纔會真正在JVM中建立了一個線程。對象

  • 線程對象進入RUNNABLE必須調用start,可是線程的運行與否,同樣須要放任與CPU的調度。進入RUNNABLE狀態後,線程只能意外終止或者進入RUNNING狀態。

  • 線程對象進入RUNNING後,可能會有如下的可能

  • 線程對象進入BLOCKED後,可能會如下狀態

  • 線程對象進入TERMINATED後,也會有幾種狀況(這是線程的最終狀態了,線程不會切換到其餘任何狀態):

Thread經常使用方法

(1)sleep() 和 yield()區別

  • sleep會致使當前線程暫停指定的時間,沒有CPU時間片的消耗
  • yield只是對CPU調度器的一個提示,若是CPU沒有忽略這個提示,它會致使線程上下文的切換。
  • sleep會使線程短暫的block,會在給定的時間內釋放CPU資源
  • yield會使running狀態的Thread進入runnable狀態
  • sleep機會百分百的完成了給定時間的休眠,而yield的提示並不能必定擔保
  • 調用interruptsleep能夠捕獲到,而yield不會

(2)interrupt:線程的flag將會被設置,打斷正在運行的狀態。

(3)isInterrupted:線程狀態的判斷

(4)interrupted:是一個靜態方法,會將當前的線程的狀態設置爲false,返回當前狀態,第一次返回true,一直調用都只會返回false

Thread的源碼分析

構造方法

閱讀源碼總結

  1. 線程的默認命名:線程會以"Thread-"做爲一個自增數字爲組合。

  2. 新建立的任何一個線程都會有一個父線程

    • 一個線程的建立必定是由另一個線程完成的
    • 被建立的線程的父線程必定是建立他的線程,main函數所在的線程是有JVM建立的,即main線程,而main線程的父線程爲System。
  3. 新建的線程若是沒有顯示指定線程組,則他會加入到父線程的線程組中。

  4. start()分析:模板設計模式:線程真正的邏輯實如今run方法中,咱們須要經過重寫Runnable接口對其進行構造,run方法是一個空的實現

  1. Thread對象建立後處於NEW狀態,threadStatus這個內部屬性爲0,在start方法中會判斷這個內部屬性是否爲0,若是不等於0會發生異常,因此說不能重複調用start方法或者在線程 結束後從新start。
  2. 線程啓動後會被加入到一個線程組中,若是沒有指定特定的線程組,會默認加入currentThread的線程組中。
相關文章
相關標籤/搜索