1. ホーム
  2. java

ソケットIO操作でブロックしているスレッドを即座に終了させる方法は?

2023-09-05 04:53:18

質問

Javaのコンテキストで、私はGUIウィンドウを開いたときにネットワーク入力を読み取るために新しいスレッドを作成し、ウィンドウを閉じたときに、私はソケットリソースを解放し、すぐにスレッドを終了したいと思います。現在、私はsetSoTimeoutメソッドを使用していますが、私はタイムアウトの例外を待ちたくはありません。誰かがいくつかの提案を与えることができますか?ありがとうございます!

どのように解決するのですか?

3つの方法があります(可能性があります)。

  • 呼び出す Socket.close() を呼び出すと、ソケットに関連付けられた InputStreamOutputStream オブジェクトを生成し、Socket または (関連する) ストリーム操作でブロックされたスレッドをブロック解除するようにします。 javadocによると、ソケット自体への操作は SocketException .

  • 呼び出し Thread.interrupt() を呼び出すと、(指定されていないいくつかの状況下で) ブロックされている I/O 操作を中断し、その結果 InterruptedIOException .

    注意事項に注意してください。 どうやら "interrupt()" のアプローチは "most" モダンな Java プラットフォームでは動作しないようです。 (もし他の誰かが時間と気力があれば、このアプローチが動作する状況を調査することが可能でしょう。 しかし、動作がプラットフォーム固有であるという事実だけで、アプリケーションが特定のプラットフォームで動作する必要がある場合にのみ、それを使うべきであるということを示すのに十分なはずです。その時点では、簡単に "それを自分で試すことができます)。

  • 3つ目の方法として考えられるのは Socket.shutdownInput() そして Socket.shutdownOutput() . javadocsはブロックされている読み取り/書き込み操作で何が起こるかを明確に述べていませんが、ブロックが解除されて例外が投げられると考えるのは無理なことではありません。 しかし、もしjavadocが何が起こるかを言っていないなら、その動作はプラットフォーム固有であると仮定すべきです。