這個片段是從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去的地方。儘管清洗方法也會重新拋出運行時異常(至少在本例中) –