我正在尝试在多个线程中逐行读取来自套接字的输入。如何中断 readLine()
以便优雅地停止它阻塞的线程?
编辑(赏金):这可以在不关闭套接字的情况下完成吗?
最佳答案
不关闭套接字:
困难的不是BufferedReader.readLine
,而是底层的read
。如果线程被阻塞读取,唯一的方法是提供一些实际数据或关闭套接字(中断线程可能应该有效,但实际上不会)。
所以显而易见的解决方案是有两个线程。读取原始数据并将保持阻塞状态的一种。第二个,将是调用 readLine
的线程。管道数据从第一个到第二个。然后,您可以访问一个锁,该锁可用于唤醒第二个线程,并让它采取适当的行动。
有变化。您可以让第一个线程使用 NIO,在所有消费者之间共享一个线程实例。
或者,您可以编写一个与 NIO 一起使用的 readLine
。这甚至可以采用相对简单的单线程形式,因为 Selector.wakeup
存在并且有效。
关于java - 如何中断 BufferedReader 的 readLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595926/