1 單個執行緒中序列地執行任務
—缺點:伺服器的響應慢、吞吐量低、資源利用率低。(i/o阻塞、網路擁塞等問題造成)
—適合於任務數量很少且執行時間很長,或者當伺服器只為單個使用者提供服務而該使用者每次只發出乙個請求的情況。
2 為每個請求建立乙個新的執行緒來提供服務
— 優點:
· 帶來更快的響應性:將任務處理過程從主線程中分離出來,使得程式在完成前面的請求之前可以接受新的請求,從而提高響應性。
· 更高的吞吐率:任務可以並行處理,從而能服務多個請求。如果有多個處理器或者任務由於某種原因(如等待i/o完成、獲取鎖等)被阻塞,程式的吞吐量將得到提高。
—由於使用了多執行緒,因此任務處理**必須是執行緒完全的。
—不足:
· 執行緒生命週期的開銷非常高。執行緒的建立與銷毀並不是沒有代價的。
· 資源消耗。活躍的執行緒會消耗系統資源,尤其是記憶體。如果可執行的執行緒數量多餘可用處理器的數量,那麼閒置的執行緒會占用系統資源;而且,大量執行緒在競爭cpu資源時還會產生其他的效能開銷。
· 穩定性。在可建立執行緒的數量上存在乙個限制。這個限制值隨平台的不同而不同,並且受多個因素制約,包括jvm的啟動引數、thread建構函式中請求的棧大小、底層作業系統對執行緒的限制等。
3 executor框架
—executor是個介面,為靈活且強大的非同步任務執行框架提供了基礎,能支援多種不同型別的任務執行策略。它提供了一種標準的方法將任務的提交過程與執行過程解耦開來,並用runnable來表示任務。executor的實現還提供了對生命週期的支援,以及統計資訊收集、應用程式管理機制和效能監視等機制。
—executor基於生產者-消費者模式。
(1)執行緒池
—executor擴充套件了executorservice介面,新增了一些用於生命週期管理的方法。
—executorservice的生命週期有3種狀態:
· 執行:初始化建立時處於執行狀態。
· 關閉:shutdown方法將執行平緩的關閉過程:不再接受新的任務,同時等待已提交的任務執行完成(包括那些還未開始執行的任務);shutdownnow方法將執行粗暴的關閉過程:它將嘗試取消所有執行中的任務,並且不再啟動佇列中尚未開始執行的任務。
· 已終止:等所有任務都完成後,executorservice將轉入終止狀態。可以通過呼叫awaittermination來等待executorservice到達終止狀態,或者通過呼叫isterminated來輪詢executorservice是否已經終止。
(3)延遲任務與週期任務
—timer類負責管理延遲任務(「在100ms後執行該任務」)以及週期任務(「每10ms執行一次該任務」)。
—timer類的問題:
· timer在執行所有定時任務時只會建立乙個執行緒。如果某個任務的執行時間過長,那麼將破壞其他timetask的定時精確性。
· 如果timetask丟擲了乙個未檢查的異常,那麼timer將表現出糟糕的行為。timer執行緒並不捕獲異常,因此當timetask丟擲未檢查的異常時將終止定時執行緒。這種情況下,timer也不會恢復執行緒的執行,而是會錯誤地認為整個timer都被取消了。因此,已經被排程但尚未執行timetask將不會再執行,新的任務也不能被排程(「執行緒洩露」)。
—替代選擇:scheduledthreadpoolexecutor。
java併發程式設計實戰 筆記 任務執行
excutor框架 excutor框架將任務的提交和執行分離開,任務提交會遍布到程式的各個地方,但執行策略的設定可以在乙個地方,如用執行緒池執行還是序列執行,執行緒池固定長度還是變長,所有顯示地使用new thread task 的地方都應該考慮下excutor框架 攜帶結果的任務callable和...
併發程式設計 任務執行
1 每當看到下面這種 new thread runnable start 時,請考慮用executor 2 executor 1 建立方式 executors.new.2 通過使用executor,可以實現各種調優 管理 監視 記錄日誌 錯誤報告 3 executor有4個生命週期 建立 提交 開始...
SpringBoot併發執行定時任務
剛剛看了下spring boot實現定時任務的文章,感覺還不錯。spring boot 使用spring自帶的schedule來實現定時任務變得非常簡單和方便。在這裡個大家分享下。enablescheduling 開啟定時任務 public static void main string args ...