建立線程的兩種方法
繼承Thread類或實現Runnable接口。都是重寫了 run() 方法。 執行線程都是用Thread類的start()方法。java
線程的5種狀態微信
- 新建狀態(New):線程對象被建立後,就進入了新建狀態。eg,Thread = new Thread();
- 就緒狀態(Runnable):又稱可執行狀態。線程對象建立後調用了start() 方法啓動線程
- 運行狀態(Running):線程獲取CPU進行執行。只能從就緒狀態進入運行狀態。
- 阻塞狀態(Blocked):因某種緣由放棄CPU使用權,暫時中止運行。緣由有三種:
- 等待阻塞 --> 經過調用線程的wait()或sleep()或join()方法,讓線程等待某工做完成。
- 同步阻塞 --> 線程在獲取synchronized同步鎖失敗(被其餘線程佔用)
- 其餘阻塞 --> 經過調用線程的發出了I/O請求時,線程會進入同步阻塞狀態
- 死亡狀態(Dead):線程執行完了或異常退出了run()方法。結束生命週期
![狀態轉換圖](http://static.javashuo.com/static/loading.gif)
注意
這五種狀態是咱們認知上的五種狀態,固然在程序執行中,阻塞狀態就有多種類型, 下面是java源代碼中的六種狀態併發
- NEW 在執行start()方法以前
- RUNNABLE 執行或等待資源
- BLOCKED 線程在等待monitor鎖(synchronized 關鍵字)
- WAITING Object.wait() 和 Thread.join() 和 LockSupport.park() 方法會形成這種等待阻塞
- TIMED_WAITING 暫且叫限時等待,是上面方法加了一個等待時間,或者LockSupport的其餘方法
- TERMINATED 終止狀態·
線程能夠設置爲守護線程,但必須在調用 start()以前設置。優化
經常使用的同步類(不知道合適不合適)
- CountDownLatch 一般用來使主線程等待其餘線程執行完再執行所用到
- ReentrantLock 併發時,它增長了一些synchronized沒有的方法,更方便管理
- synchronized 簡單的同步就用這個吧
interrupt()和 interrupted()和 isInterrupted() 區別
- 當某個線程調用了interrupt()方法後,至關於給該線程打上了一箇中斷標誌,若是線程正好處於阻塞狀態,會直接拋出InterruptedException 異常
- interrupted()方法用來檢測「當前線程」的中斷狀態,且會將中斷狀態標誌清除。
- isInterrupted()方法用來檢測「this」的中斷狀態,且不會改變線程的狀態標誌。
獲取線程終端狀態 要用Thread.currentThread().isInterrupted() 比較標準this
volatile關鍵字
- volatile保證可見性 一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾以後,那麼就具有了兩層語義: 1)保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。 2)禁止進行指令重排序。
- volatile不能確保原子性
- volatile保證有序性 在前面提到volatile關鍵字能禁止指令重排序,因此volatile能在必定程度上保證有序性。 volatile關鍵字禁止指令重排序有兩層意思: 1)當程序執行到volatile變量的讀操做或者寫操做時,在其前面的操做的更改確定所有已經進行,且結果已經對後面的操做可見;在其後面的操做確定尚未進行; 2)在進行指令優化時,不能將在對volatile變量的讀操做或者寫操做的語句放在其後面執行,也不能把volatile變量後面的語句放到其前面執行。
提個問題,你們能夠想象想,**volatile的應用場景 ** 是什麼,能夠在評論區討論哦!請關注微信公衆號,查看,嘻嘻。不過之後會在評論區回覆的!!線程
最後,建議你們多手動練練,有時候看的時候,感受會了,但動起手來,不必定會了。對象
歡迎關注個人微信公衆號cobs-snail,讓咱們一塊兒前進吧!!排序
![前進吧蝸牛 前進吧蝸牛](http://static.javashuo.com/static/loading.gif)