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

6

假设我开始了一个线程,并且有如下内容:

 ...//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对象。

我知道你可以从不同的线程关闭socket来中断这个线程。但是当我尝试使用future.cancel(true)方法时,即使它返回true,该线程似乎仍在运行,有人知道为什么吗?或者说in.readLine()不能通过这种方式中断吗?

3个回答

10
您好,以下是翻译内容:

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

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

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


3
你可以关闭输入流来触发一个IOException。否则,readLine()可能会一直阻塞。我已经看过JavaLangAccess.blockedOn(),但它看起来相当低级。

1

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接