日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程:interrupted、isinterrupted区别

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程: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,除非中間線程的中斷狀態被其他操作清除了。


看看內部實現

因此這兩個方法有兩個主要區別:

  • interrupted 是作用于當前線程,isInterrupted 是作用于調用該方法的線程對象所對應的線程。(線程對象對應的線程不一定是當前運行的線程。例如我們可以在A線程中去調用B線程對象的isInterrupted方法。)
  • 這兩個方法最終都會調用同一個方法-----isInterrupted( Boolean 參數),,只不過參數固定為一個是true,一個是false; ? ? ? ? ? ? ??注意:?isInterrupted( Boolean 參數)是isInterrupted(?)的重載方法。
  • ?

    由于第二個區別主要體現在調用的方法的參數上,讓我們來看一看這個參數是什么含義

    ?

    先來看一看被調用的方法 isInterrupted(boolean arg)(Thread類中重載的方法)的定義:

    1private?native?boolean?isInterrupted(?boolean?ClearInterrupted);

    原來這是一個本地方法,看不到源碼。不過沒關系,通過參數名ClearInterrupted我們就能知道,這個參數代表是否要清除狀態位。

    如果這個參數為true,說明返回線程的狀態位后,要清掉原來的狀態位(恢復成原來情況)。這個參數為false,就是直接返回線程的狀態位。

    這兩個方法很好區分,只有當前線程才能清除自己的中斷位(對應interrupted()方法)

    總結

    以上是生活随笔為你收集整理的多线程:interrupted、isinterrupted区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。