Java多線程當中斷線程(Interrupt)的應用詳解。本站提示廣大學習愛好者:(Java多線程當中斷線程(Interrupt)的應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程當中斷線程(Interrupt)的應用詳解正文
interrupt辦法
interrupt字面上是中止的意思,但在Java裡Thread.interrupt()辦法現實上經由過程某種方法告訴線程,其實不會直接中斷該線程。詳細做甚麼工作由寫代碼的人決議,平日我們會中斷該線程。
假如線程在挪用Object類的wait()、wait(long)或wait(long, int)辦法,或許該類的 join() 、join(long) 、join(long, int) 、sleep(long) 或 sleep(long, int) 辦法進程中受阻,則個中斷狀況將被消除,它還將收到一個 InterruptedException。
假如該線程在可中止的通道(java.nio.channels.InterruptibleChannel)上的 I/O 操作中受阻,則該通道將被封閉,該線程的中止狀況將被設置而且該線程將收到一個 ClosedByInterruptException。
假如該線程在一個 Selector (java.nio.channels.Selector) 中受阻,則該線程的中止狀況將被設置,它將立刻從選擇操作前往,並能夠帶有一個非零值,就似乎挪用了選擇器的 wakeup 辦法一樣。
假如之前的前提都沒有保留,則該線程的中止狀況將被設置。
中止一個不處於運動狀況的線程不須要任何感化。
檢測中止
若何檢測中止決議於線程所做的工作。
假如線程挪用可以拋出InterruptException的辦法,則捕捉InterruptException,然後在catch塊中處置(平日是加入run辦法以中止線程)
假如挪用其它辦法,則可以在余暇時檢討Thread.interrupted以斷定能否收到中止旌旗燈號,確認收到中止旌旗燈號落後行處置。可以拋出一個InterruptException從而和前一種處置辦法堅持分歧
中止狀況
線程的中止機制是應用中止狀況這一外部標記完成的。中止狀況在挪用線程的interrupt()辦法時被設置(參考下面的interrupt辦法解釋)。
有兩種辦法可以獲得線程的中止狀況:
挪用靜態辦法Thread.interrupted(),該辦法除前往以後線程的中止狀況外,還會消除以後線程的中止狀況。換句話說,假如持續兩次挪用該辦法,則第二次挪用將前往 false(在第一次挪用已消除了個中斷狀況以後,且第二次挪用磨練完中止狀況前,以後線程再次中止的情形除外)。
挪用指定線程的isInterrupted()辦法,該辦法只前往指定線程的中止狀況而不影響該線程的中止狀況。
有兩種辦法可以消除線程的中止狀況:
如上所述,挪用Thread.interrupted()
挪用該線程的interrupt()辦法激發InterruptedException的時刻同時就曾經消除了地點線程的中止狀況,包含Object類的wait()、wait(long)或wait(long, int)辦法,或許線程的 join() 、join(long) 、join(long, int) 、sleep(long) 或 sleep(long, int) 辦法