【问题标题】:Can you interrupt BufferedReader.readLine() with Future.cancel(true)?你能用 Future.cancel(true) 中断 BufferedReader.readLine() 吗?
【发布时间】:2012-04-16 07:03:01
【问题描述】:

假设我开始了一个线程并且我有这样的事情:

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

            }

    }

 );

executor 是 ExecutorService 对象,in 是 BufferedReader 对象

我知道你可以从另一个线程关闭套接字来中断这个线程。但是当我尝试使用 future.cancel(true) 方法时,即使它返回 true,线程似乎仍在运行,有人知道为什么吗?还是 in.readLine() 不能这样中断?

【问题讨论】:

    标签: java multithreading java.util.concurrent


    【解决方案1】:

    你能用 Future.cancel(true) 中断 BufferedReader.readLine() 吗?

    future.cancel(true) 所做的只是在关联线程上调用thread.interrupt()。这将导致sleep()wait() 操作抛出InterruptedException 并会中断一些特殊的NIO channels

    但是您的BufferedReader 很可能不会被中断,因为它很可能是从“正常”套接字或文件中读取的。正如您所提到的,从不同的线程关闭底层套接字是杀死这种 IO 方法的最佳方法。

    【讨论】:

      【解决方案2】:

      您可以关闭输入流以触发 IOException。否则 readLine() 可能会永远阻塞。

      我看过使用 JavaLangAccess.blockedOn() 但它看起来相当低级。

      【讨论】:

        【解决方案3】:

        readLine 不会抛出InterruptedException 所以如果它运行的线程被中断也不会受到影响。需要显式检查线程的中断状态:

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

        但如果它在执行 readLine 时阻塞,中断它的唯一方法是关闭将抛出 IOException 的底层流。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-14
          • 2010-11-15
          • 2011-07-09
          • 1970-01-01
          • 1970-01-01
          • 2011-08-14
          • 2022-12-06
          相关资源
          最近更新 更多