如何中断 BufferedReader 的 readLine

2022-09-01 00:03:21

我正在尝试在多个线程中逐行从套接字读取输入。如何中断,以便可以优雅地停止它阻塞的线程?readLine()

编辑(赏金):这可以在不关闭套接字的情况下完成吗?


答案 1

不关闭套接字:

困难的问题不是 ,而是潜在的 .如果线程被阻塞读取,则使其运行的唯一方法是提供一些实际数据或关闭套接字(中断线程可能应该有效,但实际上不起作用)。BufferedReader.readLineread

因此,显而易见的解决方案是有两个线程。读取原始数据,并保持阻止状态。第二个,将是调用 的线程。通过管道将数据从第一个管道传输到第二个管道。然后,您可以访问可用于唤醒第二个线程的锁,并让它采取适当的操作。readLine

有变化。您可以使用 NIO 创建第一个线程,并在所有使用者之间共享一个线程实例。

或者,您可以编写一个与NIO一起使用的。这甚至可以采用相对简单的单线程形式,因为存在并且有效。readLineSelector.wakeup


答案 2

关闭中断线程上的套接字。这将导致在中断的线程上引发异常。

有关此问题和其他并发问题的更多信息,我强烈推荐Brian Goetz的书“Java Concurrency in Practice”。