咱們的線程被餓死了

咱們的線程被餓死了java

咱們在構建線程池的時候能夠構建單個線程的線程池和多個線程的線程池。git

那麼線程池使用不當可不可能產生死鎖呢?咱們知道死鎖是循環爭奪資源而產生的。線程池中的線程也是資源的一種,那麼若是對線程池中的線程進行爭奪的話也是可能產生死鎖的。github

在單個線程的線程池中,若是一個正在執行的線程中,使用該線程池再去提交第二個任務,由於線程池中的線程只有一個,那麼第二個任務將會等待第一個任務的執行完成來釋放線程,而第一個任務又在等待第二任務的執行來完成任務。從而產生了線程飢餓死鎖(Thread Starvation Deadlock).線程

線程飢餓死鎖並不必定在單個線程的線程池中產生,只要有這種循環使用線程池的狀況均可能產生這種問題。code

咱們看下例子:資源

public class ThreadPoolDeadlock {

    ExecutorService executorService= Executors.newSingleThreadExecutor();

    public class RenderPageTask implements Callable<String> {
        public String call() throws Exception{
            Future<String> header, footer;
            header= executorService.submit(()->{
                return "header";
            });
            footer= executorService.submit(()->{
                return "footer";
            });
            return header.get()+ footer.get();
        }
    }

    public void submitTask(){
        executorService.submit(new RenderPageTask());
    }
}

咱們在executorService中提交了一個RenderPageTask,而RenderPageTask又提交了兩個task。由於ExecutorService線程池只有一個線程,則會產生死鎖。get

咱們的線程被餓死了!博客

本文的例子請參考https://github.com/ddean2009/learn-java-concurrency/tree/master/ThreadPoolDeadlockit

更多內容請訪問 flydean的博客io

相關文章
相關標籤/搜索