【问题标题】:How do i stop blocking read on BufferedReader.readline()?如何停止在 BufferedReader.readline() 上阻止读取?
【发布时间】:2012-10-23 10:35:50
【问题描述】:

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

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();

在一个单独的线程中,我从我的套接字的 InputStream 进行监听。如果我从这个流中接收到一些东西,然后我会尝试通过调用System.in.close() 来“解锁”readLine,而无需等待用户的输入。然后主线程可以继续对从套接字读取或从用户获得的信息进行处理。

不知何故,它似​​乎可以在我的 Mac 上运行,但如果我在 Windows 上尝试,单步调试调试器,我发现 System.in.close() 会阻塞,整个程序会挂起。

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

【问题讨论】:

标签: java multithreading


【解决方案1】:

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

更新:Selector 可能更适合您的目的。监听你的套​​接字和 System.in,然后对提供输入的那个采取行动?

【讨论】:

  • 您无法在 System.in 上选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2012-03-29
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多