如果使用過執行緒池,細心的同學肯定會注意到,new乙個執行緒池,但是如果不往裡面提交任何任務的話,main方法執行完之後程式會退出,但是如果向執行緒池中提交了任務的話,main方法執行完畢之後程式是不會自動退出的,是什麼原理,或者說是什麼原因導致任務提交到執行緒池之後任務執行完程式無法自動退出的呢?下面就讓我們趴開執行緒池的原始碼,一**竟。
我們直接從threadpoolexecutor的execute方法開始說起。執行緒提交到threadpoolexecutor執行分為三種情況,具體如下:
public void execute(runnable command)
//2、當前執行緒池中的執行緒數大於corepoolsize,直接將任務放入工作佇列
if (isrunning(c) && workqueue.offer(command))
//3、如果入隊失敗,嘗試啟動新的執行緒,即此時工作佇列已滿,執行緒池中的執行緒數大於corepoolsize小於maxpoolsize
else if (!addworker(command, false))
reject(command);//啟動新的執行緒失敗,執行拒絕策略
}
現在我們知道,將乙個任務提交到threadpoolexecutor執行緒池執行分為三種情況,可以看到,三種情況下都有乙個addworker的動作,下面我們主要看看addworker裡面做了什麼private boolean addworker(runnable firsttask, boolean core)
}// 第二步 建立乙個worker,包裝當前的任務,並啟動該work中建立的執行緒,用於執行當前當前提交過來的任務
boolean workerstarted = false;
boolean workeradded = false;
worker w = null;
try
} finally
if (workeradded)
}} finally
return workerstarted;
}
這裡分為兩步,首先使用cas操作保證成功增加workercount,然後將建立乙個worker,將worker新增人worker池,啟動worker,返回任務新增成功
worker是threadpoolexecutor執行緒池的內部類,主要作為使用者提交任務的包裝,它繼承自abstractqueuedsynchronizer類並實現了runnable介面,它的run方法很簡單,直接呼叫runworker方法,runworker如下:
final void runworker(worker w) catch (runtimeexception x) catch (error x) catch (throwable x) finally
} finally
}completedabruptly = false;
} finally
}
可以看到,在runworker中使用了乙個while迴圈,使用gettask去獲取任務, gettask如下:private runnable gettask()
int wc = workercountof(c);
// are workers subject to culling?
boolean timed = allowcorethreadtimeout || wc > corepoolsize;
if ((wc > maximumpoolsize || (timed && timedout))
&& (wc > 1 || workqueue.isempty()))
try catch (interruptedexception retry)
}}
gettask通過workqueue.take();方法獲取任務,我們知道,blockingqueue的take方法是阻塞的,當隊列為空時,會一直阻塞知道獲取新的任務,到這裡,我們便可以回答上面提到的問題了
重新梳理一遍,使用者向threadpoolexecutor執行緒池中新增任務時,threadpoolexecutor會建立乙個worker,用來包裝並執行使用者任務,worker的run方法中採用while迴圈,通過gettask方法不斷的取出工作佇列中的任務執行,當任務隊列為空時,take方法阻塞了執行緒,導致任務執行執行緒一直不會退出,所以使用者想threadpoolexecutor執行緒池中提交任務之後程式不會自動結束,就是這個原理。
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...
mysql 執行緒池 c MySQL執行緒池
mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...