29 非同步任務提交執行架構

2021-09-02 16:23:38 字數 3827 閱讀 4603

非同步任務提交執行架構

類關係圖

示例:執行緒池提交runnable任務

示例:執行緒池提交callable任務

executor  執行緒提交介面

executor(runnable c):將runnable任務提交到執行緒池中

executorservice  執行緒池介面

提交非同步任務方法:

execute(runnable c):向執行緒池中提交任務。

future> submit(runnable task)futuresubmit(callabletask)

向執行緒池中提交任務。區別在於runnable在執行完畢後沒有結果,callable執行完畢後有乙個結果。相同點在於都返回乙個future物件(可以阻塞執行緒直到執行完畢,也可以取消任務執行,也能夠檢測任務是否被取消或者是否執行完畢)。

execute()submit()的區別

executor()的入參可以為runnable以及callable物件,同時又返回值;

當外部需要對執行緒丟擲的異常進行捕獲處理時,使用submit()方式提交,客通過future.get()捕獲。

scheduledexecutorservice 定時排程介面

和timer/timertask類似,用於解決重複執行的任務

threadpoolexecutor執行緒池類

構造方法1

keepalivetime:當執行緒數大於core數,那麼超過該時間的執行緒將會被終結。

workqueue若執行緒池已經被佔滿,則該佇列用於存放無法再放入執行緒池中的runnable。

構造方法2

threadpoolexecutor(int corepoolsize, int maximumpoolsize, long keepalivetime, timeunit unit,blockingqueueworkqueue, rejectedexecutionhandler handler)

其中handler表示執行緒池對拒絕任務的處理策略。

使用注意事項

若執行緒池中的執行緒數量小於corepoolsize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。

若執行緒池中的執行緒數量等於corepoolsize且緩衝佇列workqueue未滿,則任務被放入緩衝佇列。

若執行緒池中線程的數量大於corepoolsize且緩衝佇列workqueue滿,且執行緒池中的數量小於maximumpoolsize,則建新的執行緒來處理被新增的任務。

若執行緒池中線程的數量大於corepoolsize且緩衝佇列workqueue滿,且執行緒池中的數量等於maximumpoolsize,那麼通過handler所指定的策略來處理此任務。

當執行緒池中的執行緒數量大於corepoolsize時,如果某執行緒空閒時間超過keepalivetime,執行緒將被終止。

executors 工廠

提供靜態方法,用於建立executorservice執行緒池,其實質呼叫的是threadpoolexecutor的構造器。

單執行緒的執行緒池newsinglethreadexecutor(...)

建立固定大小的執行緒池newfixedthreadpool(...)

每次提交乙個任務就建立乙個執行緒,直到執行緒達到執行緒池的最大大小,達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充乙個新執行緒。

可根據需要建立新執行緒的執行緒池newcachedthreadpool(...)

當執行緒池大小超過了需要處理任務需要的執行緒時,會自動**空閒執行緒(60秒)。當任務增加時,會自動的新增新的執行緒來處理,執行緒池的大小取決於jvm能建立的最大執行緒的大小。容易導致記憶體不足。

大小不限的定時排程的執行緒池newscheduledthreadpool(...)

建立乙個執行緒池,它可安排在給定延遲後執行命令或者定期地執行。

單執行緒的定時排程的執行緒池newsinglethreadscheduledexecutor()

建立乙個使用單個 worker 執行緒的 executor,以無界佇列方式來執行該執行緒,並在需要時使用提供的 threadfactory 建立新執行緒。

執行緒池的生命週期

啟動執行緒池

執行緒池被構造完成之後,進入可執行狀態;在接到任務後,進入執行狀態。

關閉執行緒池

shutdown():平緩的關閉執行緒池。

執行緒池停止接受新的任務,同時等待已經提交的任務執行完畢,包括那些進入佇列還沒有開始的任務。shutdown()方法執行過程中,執行緒池處於shutdown狀態。

shutdownnow():立即關閉執行緒池。

執行緒池停止接受新的任務,取消所有執行的任務和已經進入佇列但是還沒有執行的任務。

shutdownnow()方法執行過程中,執行緒池處於stop狀態。

shutdownnow方法本質是呼叫thread.interrupt()方法(讓執行緒處於interrupted狀態,並不會讓線**正的停止)。執行緒中必須要有處理interrupt事件的機制才能停止執行緒。

執行緒池結束terminated

即shutdown()或者shutdownnow()執行完畢,執行緒池就結束了(terminated)。

isterminating() 如果關閉後所有任務都已完成,則返回 true。

isshutdown() 如果此執行程式已關閉,則返回 true。

Spark任務提交執行全流程詳解

spark任務的本質是對我們編寫的rdd的依賴關係切分成乙個個stage,將stage按照分區分批次的生成taskset傳送到executor進行任務的執行 spark任務分兩種 1 shufflemaptask shuffle之後的task 2 resulttask shuffle之前的task ...

Spark指令碼提交 執行 部署

執行spark shell需要指向申請資源的standalone spark集群資訊,其引數為master,還可以指定executor及driver的記憶體大小。sudo spark shell executor memory 5g driver memory1g master spark spar...

Spark指令碼提交 執行 部署

尊重版權,謝謝分享 執行spark shell需要指向申請資源的standalone spark集群資訊,其引數為master,還可以指定executor及driver的記憶體大小。sudo spark shell executor memory 5g driver memory1g master ...