《Java高併發編程詳解-多線程架構與設計》Thread API

摘自《Java高併發編程詳解-多線程架構與設計》第三章

1.sleep不會釋放monitor鎖的所有權

2.使用TimeUnit.XX.sleep代替Thread.sleep

3.yield讓出CPU資源

在這裏插入圖片描述

4.yield與sleep的區別

jdk1.5之前 yield 實際調用sleep(0)
sleep 會暫停線程指定時間, 沒有時間片的消耗
yield只是對cpu一個hint,cpu調度器可以忽略該提示,若未忽略會導致線程上下文切換。
yield導致 線程狀態從 RUNNING->RUNNABLE
sleep能捕捉到另一個線程的

5.線程優先級

優先級默認爲5,可選範圍在1-10
不一定有效果。特別在CPU閒時

6.線程Id

自建的線程,id並不是0,因爲自建的線程並不是第一個線程。

7.getContextClassLoader獲取線程上下文類加載器

可以通過setContextClassLoader打破雙親委派。(loadClass)
在這裏插入圖片描述

8.interrupt

可以打斷阻塞。
進入阻塞:wait/sleep/join,IntetruptiableChannel的io操作,selector的waeup

9.isInterrupted

判斷線程標誌位,判斷其是否中斷。

9.1 錯誤寫法:

注意,這裏調用了interrupt ,線程t也沒有中斷!! 因爲其未進入阻塞狀態(這裏是loop)
在這裏插入圖片描述

9.2 正確寫法:

正確的寫法是 在線程中使用 while (!Thread.currentThread().isInterrupted())
在這裏插入圖片描述

10.interrupted會直接擦除掉interrupt的標誌

如果線程被中斷,第一次調用interrupted方法會返回true,第二次會返回false.

在這裏插入圖片描述

11.Join本質是whie(thread.isAlive) thread.wait()

本質是 whie(thread.isAlive) thread.wait() ,等到thread死亡後,也就不需要notify
一定程度可以代替executor.invokeAll

在這裏插入圖片描述

注意這裏是主線程被join阻塞了,且雖然每次都join一個線程,但是其他線程早已啓動, 所以不一定會按順序執行, 只是主線程會按順序判斷。

在這裏插入圖片描述

12.線程的退出

12.1 線程運行完畢
12.2 捕捉中斷信號
12.3使用volatile開關變量

發佈於2019年7月7日 16:39:26

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章