Ваш код не блокируется - следующие действия:
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
, вы должны быть уверены, что емкости пула потоков достаточно для их выполнения с требуемым уровнем параллелизма.