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)
您的代码没有死锁 - 以下是:
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,则应确保线程池的容量足以使用所需的并行级别执行它们.