Почему это тупик - PullRequest
       9

Почему это тупик

4 голосов
/ 12 октября 2010

Код из книги «Параллелизм Java на практике» Листинг 8.1

Почему код блокируется? Это потому что rpt.call в main() в основном такой же поток, как и в Executors?

Даже если я использую 10 потоков для exec = Executors.newFixedThreadPool(10);, он все равно блокируется?

public class ThreadDeadlock {
  ExecutorService exec = Executors.newSingleThreadExecutor();

  public class RenderPageTask implements Callable<String> {
    public String call() throws Exception {
        Future<String> header, footer;
        header = exec.submit(new LoadFileTask("header.html"));
        footer = exec.submit(new LoadFileTask("footer.html"));
        String page = renderBody();
        // Will deadlock -- task waiting for result of subtask
        return header.get() + page + footer.get();
    }
  }

   public static void main(String [] args ) throws Exception {

        ThreadDeadlock td = new ThreadDeadlock();
        ThreadDeadlock.RenderPageTask rpt = td.new RenderPageTask();
        rpt.call();
    }
}

1 Ответ

9 голосов
/ 12 октября 2010

Ваш код не блокируется - следующие действия:

public class ThreadDeadlock { 
    ...     
    public static void main(String [] args ) throws Exception { 
        ThreadDeadlock td = new ThreadDeadlock(); 
        ThreadDeadlock.RenderPageTask rpt = td.new RenderPageTask(); 

        Future<String> f = td.exec.submit(rpt);

        System.out.println(f.get());
        td.exec.shutdown();
    } 
}

Это происходит, если вы отправляете несколько одновременных задач одному исполнителю потока, когда первая задача ожидает результата следующих. Он не заходит в тупик с Executors.newFixedThreadPool(2), потому что LoadFileTask s являются независимыми и могут совместно использовать один поток, когда другой используется RenderPageTask.

Смысл этого примера в том, что если вы отправляете взаимозависимые задачи в ExecutorService, вы должны быть уверены, что емкости пула потоков достаточно для их выполнения с требуемым уровнем параллелизма.

...