簡體   English   中英

為什么處於 BLOCKED 狀態的線程不會被中斷?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM