java - 如何停止阻止 BufferedReader.readline() 上的读取?

标签 java multithreading

我有一个小程序,在主线程中,我要求用户在控制台中输入。

System.out.print("Alternatively, enter peer's ID to connect:");
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader bReader = new BufferedReader(reader);
String peerID = bReader.readLine();

在一个单独的线程中,我从套接字的输入流中监听。如果我从此流中收到某些内容,我会尝试通过调用 System.in.close() 来“解锁”readLine,而无需等待用户的输入。然后主线程可以继续使用从套接字读取或从用户获取的信息执行某些操作。

不知怎的,它似乎在我的 Mac 上工作,但如果我在 Windows 上尝试它,单步调试器,我发现 System.in.close() 阻塞,整个程序将挂起。

知道为什么以及如何解锁 readline() 吗?否则重写逻辑的好方法是什么?

最佳答案

您可以尝试关闭 bReader,但更合理的方法是使用 nio 包中的可中断 io,也可能使用 Console。我会尝试使用 Console.read(CharBuffer) ,并中断线程。那“应该”有效。不过还没有测试过...

更新:但是 Selector也许会更适合你的目的。监听您的套接字和 System.in,然后对提供输入的那个进行操作?

关于java - 如何停止阻止 BufferedReader.readline() 上的读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13028530/

相关文章:

c# - ThreadPool 适合这种线程场景吗?

javascript - Android webview如何使用webkit?

swift - 如何告诉主线程 URLSessionDataTask 已经完成

ios - 串行队列(主线程除外)代码是否在主线程上执行?

java - 从不同线程将值添加到全局集中并等待所有线程完成

java - 发现调用两个点到一个方法时遇到麻烦。 "Java - distancePoint"

c# - 无法使用 JRE 7u51 在 Internet Explorer 11 中运行 Java 小程序

java - 在 Spring 中区分没有身份验证的用户

java - 使用 mockito 模拟文件系统

java - Android 在将图像上传到 Web 服务器时抛出空点异常