为什么要恢复在线程池的线程中运行的任务的中断标志

Fat*_*ure 7 java concurrency

这个片段来自JCIP(Brian Goetz),列出6.15

f.get()抛出InterruptedException和ExecutionException.现在,这些例外是否具体到未来正确?意味着未来所代表的特定任务被中断或具有内部异常.

问题 -

  1. 为什么我需要使用"Thread.currentThread().interrupt()"恢复中断?,因为我的任务运行的线程不是中断标志?这有点令人困惑.

  2. 为什么抛出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)

Joh*_*int 1

  1. 中断不一定发生在线程池的线程上。中断是指当前线程在等待未来线程完成时被中断的时刻。例如,如果您使可以取消下载的程序的另一部分可以访问 Future,则 Future.cancel(true) 将导致发生 InterruptedException,然后您可以清理其余数据。正如 Beohemaian 提到的,传播中断总是安全的。

  2. 这是个好问题。我认为这更多的是他想要的设计选择。但是您可以轻松地保留该错误并在其余部分完成后将其抛出。不过需要考虑一下,如果出现 OutOfMemoryError 该怎么办?然后,只有当错误而不是运行时异常时,洗衣程序才会有用。