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

时间:2012-10-23 10:35:50

标签: 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();

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

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

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

1 个答案:

答案 0 :(得分:1)

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

更新:Selector可能更适合您的目的。聆听你的socket和System.in,并对提供输入的那个进行操作?