java併發編程實戰(Brian Goetz)中描述:
結論1:在線程池中,如果任務依賴於其他任務,那麼可能產生死鎖。
結論2:在單線程池中,如果一個任務將另一個任務提交到同一個Executor,並且等待這個被提交的任務結果,那麼通常會引發死鎖。
先驗證結論2
package java_concurrent;
import java.util.concurrent.*;
public class ThreadDeadlock {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//同一個線程池
ExecutorService es = Executors.newFixedThreadPool(1);
Future f = es.submit(new RenderPageTask(es));
System.out.println("s1");
System.out.println(f.get());
System.out.println("s4");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
es.shutdown();
}
}
//任務1
class RenderPageTask implements Callable<String>{
ExecutorService es;
public RenderPageTask(ExecutorService es){
this.es = es;
}
@Override
public String call() throws Exception {
System.out.println("task1 call....");
Future<String> header, footer;
header = es.submit(new LoadFileTask(es, "header.html"));
System.out.println("s2");
//將發生死鎖因爲,由於任務等待子任務的結果
String h = header.get();
System.out.println("s3");
return h;
}
}
//任務2
class LoadFileTask implements Callable<String>{
ExecutorService es;
String s;
public LoadFileTask(ExecutorService es, String s){
this.es = es;
this.s = s;
System.out.println(s);
}
@Override
public String call() throws Exception {
System.out.println("task2 call....");
return this.s;
}
}
輸出結果是