1

http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.htmlIOUtils.copy()でApacheCommonsからの実装を検討していますが、最終的には次のようになります。

public static long copyLarge(InputStream input, OutputStream output)
        throws IOException {
    // DEFAULT_BUFFER_SIZE is 4096
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    long count = 0;
    int n = 0;
    while (-1 != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

私はこれをで実行してExecutorいます、タスクにはタイムアウトなどがありますが、タイムアウトしてキャンセルされても正しく理解できればFuture、このループのどこにもスレッドステータスのチェックがないため、スレッドは実行を続けます。これは危険な漏れと飢餓につながります。

ループを書き直す必要があるようですが、これを処理するための正気で正しい方法は何ですか?throw new IOException(new InterruptedException())?メソッドをスローとして宣言し、InterruptedExceptionスローします(すべてのIOヘルパーメソッドに対してそれを行うのは嫌いです)?

編集:私はちょうどグアバからチェックByteStreamsしました、そして彼らは同じことをしているようです。今、私は2つの主要なライブラリがそのようなループでの中断をサポートしていないのはなぜだろうと思っています。私は何かが足りないのですか?

4

2 に答える 2

1

ブロッキングI/O(つまり、java.ioパッケージ)の場合、これを手動でチェックし、それに応じて何かを行う必要があります。

if (Thread.currentThread().isInterrupted()) { 
    // do something here to stop processing
}

チャネル(java.nio)を使用している場合は、これを行う必要はありません。NIO操作の1つで発行されたスレッドが中断されると、その操作でClosedByInterruptExceptionがスローされます。

于 2012-06-04T19:38:31.833 に答える
0

を閉じるか、inputまたはを閉じるとoutputcopyLargeメソッドは例外をスローし、ループを終了します。

于 2012-06-04T14:50:28.843 に答える