这个片段是从JCIP(作者Brian Goetz)上市6.15为什么恢复线程池中的线程
f.get跑(任务的中断标志)抛出InterruptedException的和为ExecutionException。现在,这些例外情况对未来是否正确? 意味着未来所代表的具体任务被打断或出现内部异常。
问题 -
为什么我需要恢复使用中断 “Thread.currentThread()中断()。”? ,因为我的任务运行的线程不是中断标志吗?这有点令人困惑。
为什么抛出launderThrowable异常?如果其中一个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); }
'错误'应该是不可恢复的东西。 'StackOverflowError'如何?堆栈可能已损坏。 'InternalError'如何?它的虚拟机状态已损坏。你不能抓住他们。 –
是的你是对的。那是我用OutOfMemoryError去的地方。尽管清洗方法也会重新抛出运行时异常(至少在本例中) –