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