文章目錄
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