java - 如何中断 BufferedReader 的 readLine

标签 java multithreading

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

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

最佳答案

不关闭套接字:

困难的不是BufferedReader.readLine,而是底层的read。如果线程被阻塞读取,唯一的方法是提供一些实际数据或关闭套接字(中断线程可能应该有效,但实际上不会)。

所以显而易见的解决方案是有两个线程。读取原始数据并将保持阻塞状态的一种。第二个,将是调用 readLine 的线程。管道数据从第一个到第二个。然后,您可以访问一个锁,该锁可用于唤醒第二个线程,并让它采取适当的行动。

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

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

关于java - 如何中断 BufferedReader 的 readLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595926/

相关文章:

java - 在匿名线程中使用最终变量

java - Java语言规范中synchronized中的synchronized是什么意思以及如何使用它来产生死锁?

c# - 当主 UI 线程卡住时,为什么我的 PC 为 'freeze'?

java - 设置文本格式

java - 将对象存储在静态类中的散列中是否安全,使用线程 ID 检索该特定线程的值?

java - 从 getExternalStorageDirectory 到内部存储

java - 尝试解析日期时显示错误的日期

java - ExecutorService 与提交工作正常,但对 invokeAll 抛出错误

c++ - std::future::wait 应该使用这么多 CPU 吗?有没有更高效的调用?

java - 使用 Gson 将 JSON 数组解析为 java.util.List