Зачем восстанавливать флаг прерывания задачи, которая выполнялась в потоке пула потоков

Этот фрагмент взят из листинга 6.15 JCIP (Брайан Гетц)

f.get () выбрасывает InterruptedException и ExecutionException. Эти исключения относятся к будущему, верно? Это означает, что конкретная задача, представленная будущим, была прервана или имела внутреннее исключение.

Вопросы -

  1. Почему мне нужно восстанавливать прерывание с помощью «Thread.currentThread (). Interrupt ()»? , потому что это не флаг прерывания для потока, в котором выполнялась моя задача? Это немного сбивает с толку.

  2. Зачем генерировать исключение launderThrowable? Если в одном из файлов downloadImage возникла проблема, не следует ли нам просто обрабатывать другие загруженные изображения, чтобы их можно было выбросить отсюда и, таким образом, просто «не» обрабатывать оставшиеся фьючерсы?

     package net.jcip.examples;
    
    import java.util. *;
    import java.util.concurrent. *;
    import static net.jcip.examples.LaunderThrowable.launderThrowable;
    
     / **
      * Рендерер
      * 

    * Использование CompletionService для отображения элементов страницы по мере их доступности * * @ автор Брайан Гетц и Тим Пайерлс * / public abstract class Renderer { закрытый финальный исполнитель ExecutorService; Renderer (исполнитель ExecutorService) { this.executor = исполнитель; } void renderPage (источник CharSequence) { окончательный список info = scanForImageInfo (источник); CompletionService CompletionService = новый ExecutorCompletionService (исполнитель); for (final ImageInfo imageInfo: информация) CompleteService.submit (new Callable () { public ImageData call () { return imageInfo.downloadImage (); } }); renderText (источник); пытаться { for (int t = 0, n = info.size (); t f = CompletionService.take (); ImageData imageData = f.get (); renderImage (imageData); } } catch (InterruptedException e) { Thread.currentThread (). Прерывание (); } catch (ExecutionException e) { бросить LaunderThrowable (e.getCause ()); } } interface ImageData { } interface ImageInfo { ImageData downloadImage (); } абстрактная пустота renderText (CharSequence s); абстрактный список scanForImageInfo (CharSequence s); абстрактная пустота renderImage (ImageData i); }

7
задан FatherFigure 12 July 2011 в 00:14
поделиться