这个片段来自JCIP(Brian Goetz),列出6.15
f.get()抛出InterruptedException和ExecutionException.现在,这些例外是否具体到未来正确?意味着未来所代表的特定任务被中断或具有内部异常.
问题 -
为什么我需要使用"Thread.currentThread().interrupt()"恢复中断?,因为我的任务运行的线程不是中断标志?这有点令人困惑.
为什么抛出washderThrowable异常?如果其中一个downloadImage有问题,我们不应该只处理从这里投掷的其他下载图像,因此只是"不"处理剩余的期货吗?
package net.jcip.examples;
import java.util.*;
import java.util.concurrent.*;
import static net.jcip.examples.LaunderThrowable.launderThrowable;
/**
* Renderer
* <p/>
* Using CompletionService to render page elements as they become available
*
* @author Brian Goetz and Tim Peierls
*/
public abstract class Renderer {
private final ExecutorService executor;
Renderer(ExecutorService executor) {
this.executor = executor;
}
void renderPage(CharSequence source) {
final List<ImageInfo> info = scanForImageInfo(source);
CompletionService<ImageData> completionService =
new ExecutorCompletionService<ImageData>(executor);
for (final ImageInfo imageInfo : info)
completionService.submit(new Callable<ImageData>() {
public ImageData call() {
return imageInfo.downloadImage();
}
});
renderText(source);
try {
for (int t = 0, n = info.size(); t < n; t++) {
Future<ImageData> f = completionService.take();
ImageData imageData = f.get();
renderImage(imageData);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
throw launderThrowable(e.getCause());
}
}
interface ImageData {
}
interface ImageInfo {
ImageData downloadImage();
}
abstract void renderText(CharSequence s);
abstract List<ImageInfo> scanForImageInfo(CharSequence s);
abstract void renderImage(ImageData i);
}
Run Code Online (Sandbox Code Playgroud)中断不一定发生在线程池的线程上。中断是指当前线程在等待未来线程完成时被中断的时刻。例如,如果您使可以取消下载的程序的另一部分可以访问 Future,则 Future.cancel(true) 将导致发生 InterruptedException,然后您可以清理其余数据。正如 Beohemaian 提到的,传播中断总是安全的。
这是个好问题。我认为这更多的是他想要的设计选择。但是您可以轻松地保留该错误并在其余部分完成后将其抛出。不过需要考虑一下,如果出现 OutOfMemoryError 该怎么办?然后,只有当错误而不是运行时异常时,洗衣程序才会有用。
归档时间: |
|
查看次数: |
2037 次 |
最近记录: |