線程編程
線程是系統調度的基本單元,每當建立一個進程時,會有許多的線程,也叫輕量級進程,在一個進程中擁有多個線程,各自都有本身的計數器,堆和局部變量屬性,而且可以分享內存變量.多線程
爲何要使用多線程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()來獲取