0

メインスレッドで、コンソールでユーザーからの入力を求める小さなプログラムがあります。

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()でしょうか? そうでなければ、ロジックを書き直す良い方法は何でしょうか?

4

1 に答える 1

1

代わりに閉じようとすることもできますがbReader、より適切なアプローチは、nioパッケージで割り込み可能なioを使用し、場合によってはを使用することConsoleです。Console.read(CharBuffer)を使用して、スレッドを中断してみます。それは「機能するはず」です。まだテストしていません...

更新:しかし、セレクターはおそらくあなたの目的にさらに適しているでしょう。ソケットとSystem.inの両方を聞いて、入力を提供するものに基づいて行動しますか?

于 2012-10-23T10:45:34.753 に答える