簡體   English   中英

停止不被中斷的線程

[英]stop thread that does not get interrupted

我有一個線程,它坐在ObjectInputStream上並從中讀取對象:

public void run() {
    try {
        ois = new ObjectInputStream(clientSocket.getInputStream());

        Object o;
        while ((o = ois.readObject()) != null) {
            //do something with object
        }
    } catch (Exception ex) {
        //Log exception
    }
}

readObject不會拋出InterruptedException,據我所知,當此線程被中斷時不會拋出異常。 我該如何阻止這個帖子?

在套接字輸入流上調用close 你應該能夠從另一個線程做到這一點。

似乎clientSocket是您唯一的外部可見引用。 從另一個線程,調用clientSocket.close()

這將強制ObjectInputStream 在readObject()調用上拋出IOException 這應該觸發你的catch阻止並讓你走出循環。

重新閱讀你的問題,你說readObject不會拋出InterruptedException。 你在這一點上是正確的:我現在正在查看readObject的源代碼,它既不會throws也不會顯式隱藏InterruptedException

你應該始終能夠通過從另一個線程(或你讀取線程命名的任何線程)調用objectReadingThread.interrupt()來觸發最終的catch (Exception ex)塊(AKA exception eater)。 引用Javadoc

如果在調用Object類的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long,int)方法中阻塞了這個線程,sleep(long)或sleep(long,int),這個類的方法,然后它的中斷狀態將被清除,它將收到InterruptedException。

如果此線程在可中斷通道上的I / O操作中被阻塞,則通道將關閉,線程的中斷狀態將被設置,並且線程將收到ClosedByInterruptException。

如果此線程在Selector中被阻塞,則線程的中斷狀態將被設置,並且它將立即從選擇操作返回,可能具有非零值,就像調用選擇器的喚醒方法一樣。

如果以前的條件都不成立,則將設置該線程的中斷狀態。

如果這不起作用,我會調查“用對象做一些事情”塊並嘗試找到消耗中斷並忽略它的異常食者。

您可以嘗試捕獲InterruptedIOException 我不知道在您的特定情況下它是否有幫助,但它是處理此類情況的最清晰的Java方法。

我正在處理一個驚人的案例,盡管以某種神奇的方式捕獲了IOException EOFException未被捕獲,所以我發現你的答案也很有趣。 在另一種情況下,有一個InterruptException,盡管它不能是: 鏈接到意外的InterruptException 這些情況在接近I / O操作的異常處理中存在常見問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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