ソケットからデータを読み取るスレッド(T1としましょう)があります:
public void run() {
while (running) {
try {
BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream()) );
String input = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
別のスレッド (T2 としましょう) は、そのメソッドの 1 つでプログラムを終了しようとします。したがって、T2 は次のことを行います。
T1.running = false;
socket.close();
解決策が見つからなかったこのシナリオは次のとおりです。
- T1 はアクティブで、何らかの入力の読み取り、つまりブロッキングを待機しています。
- コンテキスト切り替え
- T2 がアクティブで、running を false に設定し、ソケットを閉じます
- コンテキスト切り替え
- T1 がブロックしていて、T2 がソケットを閉じたため、T1 は例外をスローします。私が欲しいのは、この SocketException をキャッチすることです。T1.run() に try/catch(SocketException) を入れることができません。では、T1 の実行方法でそれをキャッチするにはどうすればよいですか? T1 の実行中にそれをキャッチすることができない場合、どうすれば他の場所でキャッチできますか?
PS: 「スレッドのデバッグに関する別の質問」
通常、コードを段階的にデバッグすると、コンテキスト スイッチで「アクティブな実行中の行」が失われます。私が T1 の 20 行目にいるとしましょう。コンテキスト スイッチが発生します。プログラムが T2 の 30 行から続行すると仮定しますが、デバッガーは T2 の 30 行に移動/表示せず、代わりに「アクティブな実行中の行」に移動します。 '消えます。そのため、コードを制御できなくなります。Java には Eclipse を、C# には Visual Studio を使用しています。では、コンテキスト スイッチでのデバッグ中にコードを追跡する最善の方法は何でしょうか?