簡體   English   中英

你能用Future.cancel(true)中斷BufferedReader.readLine()嗎?

[英]Can you interrupt BufferedReader.readLine() with Future.cancel(true)?

假設我開始了一個帖子,我有這樣的事情:

 ...//initiate all the socket connection
 future = executor.submit
 (  new Runnable()
    {   public void run()
        {   ...
            ...      
            while ((str = in.readLine()) != null)
            {  //do something here

            }

    }

 );

executor是一個ExecutorService對象,並且是一個BufferedReader對象

我知道你可以從另一個線程關閉套接字來中斷這個線程。 但是當我嘗試使用future.cancel(true)方法時,即使它返回true,線程似乎仍然在運行,任何人都知道為什么? 或in.readLine()不能以這種方式中斷?

你能用Future.cancel(true)中斷BufferedReader.readLine()嗎?

所有future.cancel(true)都是在關聯的線程上調用thread.interrupt() 這將導致sleep()wait()操作拋出InterruptedException ,並將中斷一些特殊的NIO通道

但是很可能你的BufferedReader不會被中斷,因為它很可能是從“普通”套接字或文件中讀取的。 正如您所提到的,從不同的線程關閉底層套接字是殺死這種IO方法的最佳方法。

您可以關閉in stream以觸發IOException。 否則readLine()可以永遠阻塞。

我已經看過使用JavaLangAccess.blockedOn()但它看起來相當低級別。

readLine不會拋出InterruptedException因此如果它運行的線程被InterruptedException ,它將不會受到影響。 您需要顯式檢查線程的中斷狀態:

        while ((str = in.readLine()) != null)
        {
            if (Thread.interrupted()) {
                //You can deal with the interruption here
            }
        }

但是如果它在執行readLine時阻塞,則中斷它的唯一方法是關閉將引發IOException的底層流。

暫無
暫無

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

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