執行緒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