看了篇介紹threadpoolexecutor文章,感覺很不錯,但其中對於執行緒的復用沒有具體指出,在此進行拓展
我們在使用時threadpoolexecutor的核心方法是submit方法,用於提交任務,由此進行分析,其直接用父類abstractexecutorservice方法沒有重寫
public future<
?>
submit
(runnable task)
但execute()方法為頂層介面executor方法作為鉤子,其進行了重寫,該方法來根據各種條件來包裝成工作執行緒worker。(注意看注釋)
public
void
execute
(runnable command)
//工作執行緒數≥核心數,放入佇列,不同的執行緒池有不同的佇列if(
isrunning
(c)&& workqueue.
offer
(command)
)//佇列滿了,加入非核心執行緒池,如果失敗,執行拒絕策略
elseif(
!addworker
(command,
false))
reject
(command)
;}
重點就是包裝成worker這個工作執行緒的實現了,可以不用仔細看原始碼,這個方法最重要的功能就是生成了worker物件,並且啟動了該物件的執行緒執行。該物件在new的時候由工廠建立了乙個新執行緒,這裡的t.start()下來即會執行本方法的引數firsttask。
private
boolean
addworker
(runnable firsttask,
boolean core)
}finally
if(workeradded)}}
finally
return workerstarted;
}
worker這個類就是實現執行緒復用的根本,其實現了aqs用來進行執行緒間的同步,並且實現runnable重寫run方法。在建構函式生成thread時傳入自己,使執行緒執行start方法時最終呼叫是自己的run方法下的runworker方法;
上面一步生成worker後,啟動worker.thread.start方法,即開始執行runworker方法。
private
final
class
worker
extends
abstractqueuedsynchronizer
implements
runnable
//重寫runnable介面的run方法
public
void
run(
)
final
void
runworker
(worker w)
catch
(runtimeexception x)
}finally
gettask()方法不多解釋,就是自旋去拿佇列中的任務 ThreadPoolExecutor執行緒池原始碼解讀
主要變數 private volatile int corepoolsize private volatile int maximumpoolsize private volatile int poolsize 建構函式 也就是建立類的時候,需要注入引數。public threadpoolexecu...
ThreadPoolExecutor執行緒池引數設定
jdk1.5中引入了強大的concurrent包,其中最常用的莫過了執行緒池的實現threadpoolexecutor,它給我們帶來了極大的方便,但同時,對於該執行緒池不恰當的設定也可能使其效率並不能達到預期的效果,甚至僅相當於或低於單執行緒的效率。threadpoolexecutor類可設定的引數...
ThreadPoolExecutor執行緒池
python中已經有了threading模組,為什麼還需要執行緒池呢,執行緒池又是什麼東西呢?在介紹執行緒同步的訊號量機制的時候,舉得例子是爬蟲的例子,需要控制同時爬取的執行緒數,例子中建立了20個執行緒,而同時只允許3個執行緒在執行,但是20個執行緒都需要建立和銷毀,執行緒的建立是需要消耗系統資源...