1

Futureタスクを完了するためにタイムアウトを使用しています。TimeOutException制限時間を超えると取得します。の振る舞いから、thread dump根底にある糸が続いていることが分かります。

そうですか?ローミングする複数のスレッドをどのように処理しますか? プールから削除されたスレッドに対してnoIOExceptionがスローされた場合はどうなりますか?

これが本当なら、基にkillなるスレッドへの道は何ですか。IO私の場合、外部を待ち続けます。

スレッドダンプの一部:

Thread 29587: (state = IN_NATIVE)
 - java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Compiled frame; information may be imprecise)
 - java.net.SocketInputStream.read(byte[], int, int) @bci=84, line=129 (Compiled frame)
 - java.io.BufferedInputStream.fill() @bci=175, line=218 (Compiled frame)
 - java.io.BufferedInputStream.read1(byte[], int, int) @bci=44, line=258 (Compiled frame)
 - java.io.BufferedInputStream.read(byte[], int, int) @bci=49, line=317 (Compiled frame)
 - sun.net.www.MeteredStream.read(byte[], int, int) @bci=16, line=116 (Compiled frame)
 - java.io.FilterInputStream.read(byte[], int, int) @bci=7, line=116 (Compiled frame)
 - sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(byte[], int, int) @bci=4, line=2672 (Compiled frame)
 - javax.imageio.stream.FileCacheImageInputStream.readUntil(long) @bci=64, line=121 (Compiled frame)
 - javax.imageio.stream.FileCacheImageInputStream.read(byte[], int, int) @bci=69, line=167 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(long, boolean, boolean) @bci=0 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(boolean) @bci=12, line=532 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly() @bci=92, line=277 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(int) @bci=41, line=409 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(int, boolean) @bci=2, line=525 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(int, javax.imageio.ImageReadParam, boolean) @bci=3, line=968 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.read(int, javax.imageio.ImageReadParam) @bci=8, line=948 (Compiled frame)
 - javax.imageio.ImageIO.read(javax.imageio.stream.ImageInputStream) @bci=55, line=1422 (Compiled frame)
 - javax.imageio.ImageIO.read(java.net.URL) @bci=42, line=1374 (Compiled frame)

(ループ内の任意のタスクで) TimeOutException が発生すると、次のようにタスクをキャンセルします。

for(Entry<Requests, Future<?>> futureTask : futureTasks.entrySet())
                {
                    Future<?> future = futureTask.getValue();
                    if(!future.isDone() || future.isCancelled())
                    {
                        future.cancel(true);
                        }
                }

それは問題を解決するべきではありませんか?

ご意見をお聞かせください。

前もって感謝します。

4

1 に答える 1

2

はい、スレッドが続行され、実行されたタスクが影響を受けない場合です。TimeoutExceptionは、適切な時間内に結果を取得できなかったことを示します。

基になるスレッドに割り込みたい場合は、例外を処理し、使用されているFutureの実装からcancel(true)メソッドを使用できます。

編集

スタック トレースが説明しているように、スレッドがブロッキング I/O で待機しているケースを見逃しました。この場合、 future.cancel(true)から呼び出される Thread.interrupt( )は役に立ちません。

この状況での一般的なパターンは、基になる入力ストリームを閉じることです。javax.imageioパッケージにはあまり詳しくありませんが、 ImageIOにはInputStreamを受け入れるオーバーロードされたメソッドがあります。どこかに保存して、後でタイムアウトになったら閉じたいと思うかもしれません。

それはSocketInputStreamでclose()を呼び出し、ブロック読み取りが完了するのを待っている基礎となるSocketのclose()メソッドを呼び出します。このソケットの I/O 操作で (トレースに従って) ブロックされている実行中のスレッドは、SocketExceptionで EOF の待機を停止します。

于 2013-01-15T06:35:08.840 に答える