[英]Why does Threads in BLOCKED state do not get interrupted?
我正在研究java中的多線程。 想了解一個線程是否處於 BLOCKED 狀態,為什么它不能被中斷? 為什么線程只有在WAIT狀態下才能被中斷? 基本上,為什么我們需要兩個線程狀態,一個可以中斷,另一個不能中斷?
這個問題可能非常基本,但是,我試圖理解事物,而不僅僅是記住它們。
假設您的意思是導致線程停止其當前操作並拋出InterruptedException
? Java 中的線程中斷只是一個標志。 您可以在 BLOCKED 線程上很好地調用interrupt()
,並且下次代碼檢查時會看到該標志。
實現這種功能的主要問題是,關鍵字( synchronized
)應該如何引發異常? InterruptedException
是一個檢查異常,必須用throws InterruptedException
聲明語言中的每個同步方法(和塊)並不是一個有用的練習!
中斷是一種通信工具,它通常用於讓線程知道它需要檢查的系統狀態。 該名稱是從硬件中設置的標志繼承/向上的傳統結轉,以讓微處理器了解需要檢查的特定狀態(例如在某些輸入引腳上設置的新值)。 不要過多解讀“中斷”這個名稱,並認為它是一種用於在另一個線程中中斷程序流的工具。 它不是。 因此,即使確實拋出異常的方法將其聲明為已檢查,其他線程也可以自由地忽略它並在需要時繼續等待。 能夠任意破壞另一個線程的BLOCKED
狀態會破壞程序流,這不是目的。
阻塞的線程可以接收中斷。 您可能必須檢查Thread.currentThread().interrupted()
以查看 Thread 在等待獲取任何資源時是否中斷。
另見Lock::lockInterruptibly()
被阻塞的線程可以被中斷。 這是根據線程所處的狀態在線程上調用中斷的方式。 來自javadocs :
調用該線程的 checkAccess 方法,可能會引發 SecurityException。
如果此線程在調用 Object 類的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 時被阻塞, sleep(long), or sleep(long, int), 這個類的方法,那么它的中斷狀態會被清除並且會收到一個InterruptedException。
如果此線程在可中斷通道上的 I/O 操作中被阻塞,則通道將關閉,線程的中斷狀態將被設置,並且線程將收到 ClosedByInterruptException。
如果此線程在 Selector 中被阻塞,則線程的中斷狀態將被設置,並且它將立即從選擇操作返回,可能帶有非零值,就像調用了選擇器的喚醒方法一樣。
如果前面的條件都不成立,則將設置該線程的中斷狀態。
中斷一個不活動的線程不需要有任何效果。
拋出:SecurityException - 如果當前線程無法修改此線程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.