我期待在實施IOUtils.copy()
從Apache的百科全書在http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html並且它最終歸結爲:處理IO中斷的優雅方法是什麼?
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
番石榴,他們似乎在做同樣的事情。現在我想知道爲什麼兩個主要的圖書館不支持這種循環中的中斷。我錯過了什麼嗎?
真正的答案,這個問題好像是用NIO。它似乎對線程中斷做出了正確的反應。 –