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 对象

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

4

3 回答 3

10

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

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

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

于 2012-04-02T15:50:25.383 回答
3

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

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

于 2012-04-02T15:56:01.853 回答
1

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

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

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

于 2012-04-02T15:51:04.760 回答