为什么会陷入僵局

Don*_* Ch 4 java concurrency deadlock

"Java Concurrency in Practice"一书中的代码清单8.1

为什么代码会死锁?是因为rpt.callin 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 9

您的代码没有死锁 - 以下是:

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();
    } 
}
Run Code Online (Sandbox Code Playgroud)

如果您向单个线程执行程序提交多个同时任务,当第一个任务正在等待以下任务的结果时,会发生这种情况.它没有死锁,Executors.newFixedThreadPool(2)因为LoadFileTasks是独立的,并且当另一个线程被使用时可以共享一个线程RenderPageTask.

此示例的要点是,如果您向其提交相互依赖的任务ExecutorService,则应确保线程池的容量足以使用所需的并行级别执行它们.