Javaのコンテキストでは、GUIウィンドウを開いたときにネットワーク入力を読み込むための新しいスレッドを作成します。ウィンドウを閉じると、ソケットリソースを解放してすぐにスレッドを終了します。今私はsetSoTimeoutメソッドを使用していますが、私はタイムアウトの例外を待つことを望んでいません。誰か提案をしてもらえますか?ありがとう!ソケットIO操作でスレッドブロッキングを即座に終了する方法はありますか?
答えて
これを行うには(潜在的に)3つの方法があります。
がソケットに
Socket.close()
を呼び出すと、ストリーム操作に関連するInputStream
とOutputStream
オブジェクトを閉じ、任意のスレッドがソケットでブロックされたり(関連する)が発生しますブロックされません。 javadocによると、ソケット自体の操作はSocketException
です。Thread.interrupt()
(特定の状況では指定されていない)を呼び出すと、ブロッキングI/O操作が中断され、InterruptedIOException
がスローされます。警告に注意してください。明らかに、 "interrupt()"アプローチは、 "ほとんどの"現代のJavaプラットフォームでは機能しません。 (他の誰かが時間と傾きを持っていれば、このアプローチがうまくいく状況を調査することも可能ですが、プラットフォーム特有の動作であるという事実だけで、アプリケーションが必要な場合にのみ使用してください特定のプラットフォーム上で動作するように。あなたは簡単に自分のために「それを試す」ことができ、その時点で。)
これを行うことは可能第三の方法は、
Socket.shutdownInput()
および/またはSocket.shutdownOutput()
を呼び出すことです。 javadocは、現在ブロックされている読み書き操作で何が起こるかを明示的に述べていませんが、ブロック解除して例外をスローすると考えるのは不合理ではありません。しかし、javadocが何が起こっているのかを言わないならば、その振る舞いはプラットフォーム特有であると仮定されるべきです。
どのような状況でthread.interrupt()がブロックI/O操作を中断しますか? –
Xu DXn - 文書化されていません。一部のストリームはこれを実装しますが、他のストリームは実装しません。詳細については、OpenJDKのソースコードを読んでください。私が作ろうとしているのは、それがうまく動作しないかもしれないということです。 –
ほとんどのjvm実装は割り込み可能なIO操作をサポートしていません。私はおそらく太陽solaris jvmが一点でそれをサポートしたと思う。 – jtahlborn
私はこの質問は古いです知っているが、誰もが「現代のプラットフォーム」上Thread.interrupt()
の「謎」を解決しているように思わないように私はいくつかの研究をしました。
これはWindows7(64ビット版)のJava 8でテストされています(ただし、他のプラットフォームでも同様です)。
Thread.interrupt()
を呼び出すと、ないは何が起こることはInputStream.read()
方法は-1
で返し、Thread.interrupted()
-flagが設定されていることであるInterruptedIOException
投げるん。
だから、次はInterruptedIOException
を投げ)「修正」(読み込みと考えられる:
static final int read(Socket socket, byte[] inData)
throws SocketTimeoutException, // if setSoTimeout() was set and read timed out
InterruptedIOException, // if thread interrupted
IOException // other erors
{
InputStream in = socket.getInputStream();
int readBytes = in.read(inData, 0, inData.length);
if (Thread.interrupted())
{
throw new InterruptedIOException("Thread interrupted during socket read");
}
return readBytes;
}
入力/出力ストリーム操作中にJavaの動作が中断された場合、多くの人が期待するものではないので、 –
- 1. 即座に終了した2つのコードでは、1行目が終了する前に2行目が終了する可能性はありますか?
- 2. Androidスタジオは即座にアプリを終了します
- 3. C++ウィンドウ(winapi、コンソールではない)が即座に終了する
- 4. ThreadPoolExecutor内のすべてのワーカーを即座に強制終了する方法
- 5. テーブル名をParquetに即座に解決する方法はありますか?
- 6. Ec2インスタンスがクラウド形成で即座に終了する
- 7. タスクをキャンセルするか、タスクの実行を即座に終了するには?
- 8. SocketAsyncEventArgs - 進行中のソケット操作を検出して終了する方法?
- 9. Xcodeを終了する前にすべての操作を元に戻す方法がありますか?
- 10. OpenGLの操作が終了したかどうかを確認する方法はありますか?
- 11. 終了する前に、PythonでWebソケットを使って3回試行する方法はありますか?
- 12. 終了するまで、raw_inputを繰り返す方法はありますか?
- 13. Python:バックグラウンドプロセスに変わるスクリプトを実行すると即座に終了する
- 14. ピッキング操作はクリップ座標で意味がありますか?
- 15. 即座にメッセージをスクロールする方法
- 16. shellcodeから起動したシェルが起動時に即座に終了する
- 17. メディアストリームが受信側で終了すると、ExpandedControllerActivityを終了する方法はありますか?
- 18. iPhone:ビデオが終了する前にMPMoviePlayerControllerを終了する方法はありますか?
- 19. コンソールアプリケーションの終了を防ぐ方法はありますか?
- 20. 操作を終了します
- 21. CAsynSocketを使用して、ソケット操作の終了コードを取得する方法は?
- 22. Ruby:即座にattr_accessorを作成する方法
- 23. セッションを終了せずにセレンドライバを終了する方法はありますか? (Python)
- 24. サブシェルが戻る前にメインシェルを終了する方法はありますか?
- 25. Powershellでハングしたプロセスを終了する方法はありますか?
- 26. iBookウィジェットで「終了」イベントをキャプチャする方法はありますか?
- 27. Scalaインタプリタでパワーモードを終了する方法はありますか?
- 28. Popen終了時に信号を受信する方法はありますか?
- 29. クラスがC#で構築された後、メソッドを即座に呼び出す方法はありますか?
- 30. <table>をjQueryで即座に分割する方法は?
これは-1を得た理由を私は理解していませんか?!?私は質問がかなり明確で現場にあったと思う。 –