package ch21concurrent.examples; import java.util.concurrent.*; /** * ThreadDeadlock * <p/> * Task that deadlocks in a single-threaded Executor * * @author Brian Goetz and Tim Peierls */ public class ThreadDeadlock { ExecutorService exec = Executors.newSingleThreadExecutor(); public class LoadFileTask implements Callable<String> { private final String fileName; public LoadFileTask(String fileName) { this.fileName = fileName; } public String call() throws Exception { // Here's where we would actually read the file return ""; } } 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(); } private String renderBody() { // Here's where we would actually render the page return ""; } } }