1. 程式人生 > >執行緒02-執行緒api

執行緒02-執行緒api

sleep:使當前執行緒進入指定毫秒數的休眠,暫停執行,最終要以系統的定時器和排程器的精度為準;

休眠時,其不會放棄monitor鎖的所有權;

強烈建議使用TimeUnit替代sleep; 

 

yield:提醒排程器我願意放棄當前CPU資源,如果CPU資源不緊張,則會忽略這種提醒; 

一般這個方法不常用;

 

yield和sleep的區別

sleep會導致當前執行緒暫停指定的時間,沒有CPU時間片的消耗;

yield只是對CPU排程器的一個提示,如果CPU排程器沒有忽略這個提示,它會導致執行緒上下文的切換;

sleep會使執行緒短暫block,會在給定的時間內釋放CPU資源;

yield會使用running狀態的執行緒進入runnable狀態(如果CPU排程器沒有忽略這個提示的話);

sleep會完成給定時間的休眠,而yield的提示並不能一定擔保;

一個執行緒sleep另一個執行緒呼叫interrupt會捕獲到中斷訊號,而yield不會;

 

setPriority, getPriority

設定和獲取執行緒的優先順序,一般不使用;

 

getId:獲取執行緒的唯一ID,執行緒的ID在整個JVM程序中都會是唯一的;

 

currentThread:返回當前執行執行緒的引用;

 

getContextClassLoader, setContextClassLoader

獲取和設定該執行緒的上下文的類載入器;

 

interrupt, interrupted, isInterrupted

interrupt:當執行緒進入阻塞狀態時,另一個執行緒呼叫被阻塞執行緒的interrupt方法,則會打斷這種阻塞;

  一旦執行緒在阻塞的情況下被打斷,都會丟擲InterruptedException的異常;

isInterrupted:判斷當前執行緒是否被中斷

interrupted:判斷當前執行緒是否被中斷,當執行緒被打斷時,第一次呼叫interrupted時為true,

  第二次包括以後的呼叫永遠都會返回false(除非在此期間執行緒又一次被打斷)

 

join

join某個執行緒A,會使當前執行緒B進入等待,直到執行緒A結束生命週期,或到達給定的時間,

那麼此期間B執行緒是處於blocked的;

可用CountDownLatch和CyclicBarrier等完成類似的功能;

 

如何關閉一個執行緒

stop,不推薦使用

正常關閉

  1. 執行緒結束生命週期正常結束

  2. 捕獲中斷訊號關閉執行緒

  3. 使用volatile開關控制

 

異常退出

 

程序假死:大多是某個執行緒阻塞了,或執行緒出現死鎖的情況;

診斷工具:jstack, jconsole, jvisualvm