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

时间:2012-04-02 15:47:31

标签: java multithreading java.util.concurrent

让我说我开始了一个帖子,我有这样的事情:

 ...//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()不能以这种方式中断?

3 个答案:

答案 0 :(得分:10)

  

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

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

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

答案 1 :(得分:3)

您可以关闭in stream以触发IOException。否则readLine()可以永久阻止。

我已经看过使用JavaLangAccess.blockedOn(),但它看起来很低级。

答案 2 :(得分:1)

readLine不会抛出InterruptedException,因此如果它运行的线程被中断,它不会受到影响。您需要明确检查线程的中断状态:

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

但如果它在执行readLine时阻塞,则中断它的唯一方法是关闭将引发IOException的基础流。