メインスレッドで、コンソールでユーザーからの入力を求める小さなプログラムがあります。
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()
でしょうか? そうでなければ、ロジックを書き直す良い方法は何でしょうか?