線程飢餓鎖

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;
    }
}

輸出結果是

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章