非同步任務提交執行架構
類關係圖
示例:執行緒池提交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 ...