java 多線程(0) Java線程

線程編程

  線程是系統調度的基本單元,每當建立一個進程時,會有許多的線程,也叫輕量級進程,在一個進程中擁有多個線程,各自都有本身的計數器,堆和局部變量屬性,而且可以分享內存變量.多線程

 爲何要使用多線程post

  1.更多的處理器核心spa

  2.更快的響應時間操作系統

  3.更好的編程模型線程

優先級3d

  線程優先級決定了線程須要多或少分配一些處理器資源的線程屬性,經過priority來控制優先級,範圍從1-10,在線程構建SetPriority(int)方法來修改優先級,默認爲5.對象

線程的運行狀態blog

 

狀態名稱 說明
NEW 初始狀態,線程被構建,但尚未構建START()
RUNNABLE 運行狀態,JAVA線程將操做系統中的就緒和運行,統稱"運行中"
BLOCKED 阻塞狀態,線程阻塞與鎖
WAITING 等待狀態,線程進入等待狀態
TIME_WAITING 超時等待狀態
TERMINATED 終止狀態

在線程優先級中,JPS能夠發如今自身的生命週期中,並非固定的處於某個狀態,而是隨着代碼執行在不一樣的狀態之間切換生命週期

1-1線程運行狀態

 

Daemon線程

 

  支持型線程,主要做用於程序後臺調度以及支持性工做,當JVM不存在非DAEMON線程時,JVM將會退出,經過THREAD.SETDAEMON(TRUE)設置DAEMON線程

  !main線程隨着daemoned方法以後MAIN終止.

 

Boot And Stop

 

  理解中斷

  interrupt()對其進行中斷,線程經過檢查自身是否中斷進行響應,也能夠調用靜態方法Thread.interrupted()對當前線程終端標識位進行復位.

 

過時的STOP(),RESUME(),SUSPEND()

  死鎖致使不建議使用,suspend()方法在調用時不會釋放已被佔有的資源,而是佔有資源進入休眠狀態,stop()在終結線程不會保證線程正常釋放,因此會致使程序工做在不肯定狀態中

 

 

Volatile

    用來修飾字段,告知程序任何變量的訪問均須要從共享內存中獲取,而對他的改變必須同步刷新回共享內存,保證全部線程對變量的可見性.

 

Synchronized

  能夠修飾方法或者以同步塊的形式使用保證多個線程在同一時刻,只能有一個線程處於方法的同步塊中,保證了線程對變量訪問的可見性和排他性.

 

  !任何線程對OBJECT的訪問,首先要獲取OBJECT的監視器,若是獲取失敗進入同步隊列,狀態爲BLOCKED,當前驅釋放了鎖,釋放操做喚醒阻塞在同步隊列中的線程而且從新嘗試訪問

 

等待/通知機制

  while方法可以檢查變量是否符合預期,可是存在着如下問題

  1.難以確保及時性.

  2.難以下降開銷

  因此JAVA有內置的等待通知機制來確保矛盾的解決(JAVA.LANG.OBJECT)

  

等待/通知的相關方法
notify() 通知一個在等待得線程,從WAIT()返回
notifyAll() 通知所有在等待的線程
wait() 調用方法進入WAITING狀態,只有等待線程通知或中斷纔會返回
WAIT(LONG) 超過等待一段時間,時間爲MS
WAIIT(LONG,INT)  超時時間的控制,最低爲納秒
   

 使用NOTIFY()或NOTIFYALL()需注意

  1.先對調用對象加鎖

  2.調用WAIT()方法後,線程狀態由RUNNING轉變爲WAITING,並將當前隊列放到等待隊列

  3.NOTIFY()或NOTIFYALL()方法調用後,等待線程依舊不會從WAIT()返回,須要調用NOTIFY()或者NOTIFYALL()線程釋放以後,纔有機會返回.

  4.notify()方法將等待隊列移動到同步隊列中,notifyAll()則將所有線程移動到同步隊列中,移動狀態從WAITING轉變到BLOCKED

  5.wait()方法返回前題是得到調用對象的鎖.

 

等待/通知經典範式

  等待

  1.獲取對象的鎖

  2.條件不知足時調用WAIT()

  3.條件知足執行

   通知

  1.得到對象鎖

  2.改變條件

  3.通知全部等待的對象線程

管道I/O流

  主要用於數據傳輸,媒介爲內存

  主要包括: PipedOutputStream,PipedInputStream,PipedReader,PipedWriter

 步驟:

    connect(PIPEDREADER);

Thread.join()

  指當前線程等待Thread線程終止以後才從thread.join()返回,

 

ThreadLocal

  線程變量,以ThreadLocaL對象爲鍵,任意對象爲值得存儲結構,被附帶在線程中,一個線程能夠根據一個ThreadLocal變量對象查詢到綁定這個線程上的值

  經過SET(T)來設置一個值,get()來獲取

相關文章
相關標籤/搜索