ソケットIO操作でブロックしているスレッドを即座に終了させる方法は?
質問
Javaのコンテキストで、私はGUIウィンドウを開いたときにネットワーク入力を読み取るために新しいスレッドを作成し、ウィンドウを閉じたときに、私はソケットリソースを解放し、すぐにスレッドを終了したいと思います。現在、私はsetSoTimeoutメソッドを使用していますが、私はタイムアウトの例外を待ちたくはありません。誰かがいくつかの提案を与えることができますか?ありがとうございます!
どのように解決するのですか?
3つの方法があります(可能性があります)。
-
呼び出す
Socket.close()
を呼び出すと、ソケットに関連付けられたInputStream
とOutputStream
オブジェクトを生成し、Socket または (関連する) ストリーム操作でブロックされたスレッドをブロック解除するようにします。 javadocによると、ソケット自体への操作はSocketException
. -
呼び出し
Thread.interrupt()
を呼び出すと、(指定されていないいくつかの状況下で) ブロックされている I/O 操作を中断し、その結果InterruptedIOException
.注意事項に注意してください。 どうやら "interrupt()" のアプローチは "most" モダンな Java プラットフォームでは動作しないようです。 (もし他の誰かが時間と気力があれば、このアプローチが動作する状況を調査することが可能でしょう。 しかし、動作がプラットフォーム固有であるという事実だけで、アプリケーションが特定のプラットフォームで動作する必要がある場合にのみ、それを使うべきであるということを示すのに十分なはずです。その時点では、簡単に "それを自分で試すことができます)。
-
3つ目の方法として考えられるのは
Socket.shutdownInput()
そしてSocket.shutdownOutput()
. javadocsはブロックされている読み取り/書き込み操作で何が起こるかを明確に述べていませんが、ブロックが解除されて例外が投げられると考えるのは無理なことではありません。 しかし、もしjavadocが何が起こるかを言っていないなら、その動作はプラットフォーム固有であると仮定すべきです。
関連
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
Javaでよくある構文エラー
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Uncaught ReferenceError: は定義されていません。
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
無効な文字定数
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
java.sql.SQLException: 結果セットの開始前
-
java send https request prompt java.security.cert.について。
-
API の戻り値を処理するために ResponseEntity を使用する
-
コンストラクタDate()が未定義である問題
-
テストが空であるかどうかを判断するためのオプションの処理
-
Activityが破棄されてもAsyncTaskが停止しない