多线程:interrupted、isinterrupted区别
interrupted()是靜態方法:內部實現是調用的當前線程的isInterrupted(),并且會重置當前線程的中斷狀態
isInterrupted()是實例方法,是調用該方法的對象所表示的那個線程的isInterrupted(),不會重置當前線程的中斷狀態
結論:interrupt方法是用于中斷線程的,調用該方法的線程的狀態將被置為"中斷"狀態。注意:線程中斷僅僅是設置線程的中斷狀態位,不會停止線程。所以當一個線程處于中斷狀態時,如果再由wait、sleep以及jion三個方法引起的阻塞,那么JVM會將線程的中斷標志重新設置為false,并拋出一個InterruptedException異常(有人會問,問什么清除標志?因為我都拋出異常了,我的狀態標識位的使命已經完成了,剩下的就由程序員處理了。因此,清除標志位),然后開發人員可以中斷狀態位“的本質作用-----就是程序員根據try-catch功能塊捕捉jvm拋出的InterruptedException異常來做各種處理,比如如何退出線程??傊甶nterrupt的作用就是需要用戶自己去監視線程的狀態位并做處理?!?/p>
?
同時可以做這樣的理解:
Thread.currentThread().interrupt(); 這個用于清除中斷狀態,這樣下次調用Thread.interrupted()方法時就會一直返回為true,因為中斷標志已經被恢復了。
而調用isInterrupted()只是簡單的查詢中斷狀態,不會對狀態進行修改。
interrupt()是用來設置中斷狀態的。返回true說明中斷狀態被設置了而不是被清除了。我們調用sleep、wait等此類可中斷(throw InterruptedException)方法時,一旦方法拋出InterruptedException,當前調用該方法的線程的中斷狀態就會被jvm自動清除了,就是說我們調用該線程的isInterrupted 方法時是返回false。如果你想保持中斷狀態,可以再次調用interrupt方法設置中斷狀態。這樣做的原因是,java的中斷并不是真正的中斷線程,而只設置標志位(中斷位)來通知用戶。如果你捕獲到中斷異常,說明當前線程已經被中斷,不需要繼續保持中斷位。
interrupted是靜態方法,返回的是當前線程的中斷狀態。例如,如果當前線程被中斷(沒有拋出中斷異常,否則中斷狀態就會被清除),你調用interrupted方法,第一次會返回true。然后,當前線程的中斷狀態被方法內部清除了。第二次調用時就會返回false。如果你剛開始一直調用isInterrupted,則會一直返回true,除非中間線程的中斷狀態被其他操作清除了。
看看內部實現
因此這兩個方法有兩個主要區別:
?
由于第二個區別主要體現在調用的方法的參數上,讓我們來看一看這個參數是什么含義
?
先來看一看被調用的方法 isInterrupted(boolean arg)(Thread類中重載的方法)的定義:
| 1 | private?native?boolean?isInterrupted(?boolean?ClearInterrupted); |
原來這是一個本地方法,看不到源碼。不過沒關系,通過參數名ClearInterrupted我們就能知道,這個參數代表是否要清除狀態位。
如果這個參數為true,說明返回線程的狀態位后,要清掉原來的狀態位(恢復成原來情況)。這個參數為false,就是直接返回線程的狀態位。
這兩個方法很好區分,只有當前線程才能清除自己的中斷位(對應interrupted()方法)
總結
以上是生活随笔為你收集整理的多线程:interrupted、isinterrupted区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程:Vector是线程安全的吗
- 下一篇: 多线程:为什么wait()需要放在循环中