併發程式設計實戰 8 任務的執行與取消

2021-09-20 07:20:49 字數 1249 閱讀 1794

單執行緒順序執行任務,效率過低,沒有發揮多核的優勢。

為每個任務分配乙個執行緒去執行,速度有所提公升,但是有很大的缺陷。

生產環境中,每乙個任務分配乙個執行緒的方法存在一些缺陷,尤其是需要建立大量的執行緒時:

提供一種標準的方法將任務的提交過程與執行過程解耦,並用runnable來表示任務。executor的實現還提供了對生命週期的支援以及統計資訊收集、應用程式管理機制和效能監視等機制。

executor是基於生產者-消費者模式的,提交任務的操作相當於生產者,執行任務的執行緒則相當於消費者。

在執行策略中定義了任務執行的「what、where、when、how」等方面:

執行策略可以看做一種資源管理工具,最佳策略取決於可用的計算資源以及對服務質量的需求。

executor是非同步執行的,所以提交的任務不是立即可見的。有些任務可能已經完成,有些可能正在執行,其他任務可能在佇列中等待執行。

executor擴充套件了executorservice介面,新增了用於管理生命週期的方法。

timer在執行所有定時任務時只會建立乙個執行緒,如果某個任務的執行時間過長,將會破壞其他timertask的定時精確性。此外timer執行緒不捕獲異常,因此當timertask跑出未檢查異常時將終止定時執行緒。這種情況下,timer也不會恢復執行緒的執行,而是會錯誤的認為整個timer都被取消了。因此,已經被排程但尚未執行的timertask將不會再執行,新的任務也不能被排程。(這個問題被稱為「執行緒洩露」)。

通常,中斷是實現取消的最合理方式。

中斷策略規定執行緒如何解釋某個中斷請求—當發現中斷請求時,應該做哪些工作,哪些工作單元對於中斷來說是原子操作,以及多快的速度響應中斷。

最合理的中斷策略:某種形式的執行緒級取消操作或服務級取消操作:盡快退出,在必要時進行清理,通知某個所有者執行緒已經退出。

其他中斷策略:暫停服務或重新開始服務,適用於包含非標準中斷策略的執行緒或執行緒池。

當檢查到中斷請求時,任務並不需要放棄所有操作,它可以推遲處理中斷請求,並直到某個更何時的時刻。因此需要記住中斷請求,並在完成當前任務後丟擲interruptedexception火表示已經收到中斷請求。這麼做能夠確保在更新過程中發生中斷時,資料結構不會被破壞。

執行緒應該只能由其所有者中斷,任務**將任務提交給執行緒去執行,不應該對其執行所在的執行緒的中斷策略做出假設。由於每個執行緒擁有各自的中斷策略,除非明確知道中斷對該執行緒的含義,否則就不應該中斷這個執行緒。

只有實現了執行緒中斷策略的**才可以遮蔽中斷請求,在常規的任務和庫**中都不應該遮蔽中斷請求。

併發程式設計7 任務取消

通常如下情況會取消 1.使用者發起取消請求 2.現實的活動 3.分解任務其中一條發現了解決方案,其他的就可以取消了 4.分解任務其中一條發現了對於其他任務都有影響的錯誤,比如磁碟空間已滿,其他的可以取消了 5.關閉,當執行器關閉的時候,必須對正在處理及等待處理的任務進行優雅的關閉。乙個最簡單的方式是...

併發程式設計實戰學習筆記(四) 任務執行

基於生產者 消費者模式,提交任務的操作相當於生產者 生成待完成的工作單元 執行任務的執行緒則相當於消費者 執行完成這些工作單元 儘管伺服器不會因為建立過多的執行緒而失敗,但在足夠長的時間內,如果任務到達的速度總是超過任務執行的速度,那麼伺服器仍有可能 只是更不易 耗盡記憶體,因為等待執行的runna...

併發1 任務與執行緒

併發通常是提高執行在單處理器上的程式的效能。當以單執行緒執行所有任務時,雖然不會因為切換執行緒節省資源,但一旦出現阻塞 io請求等 則在阻塞接觸前單執行緒會發生等待。如果採用併發可在此時切換任務節省時間。所以沒有任務會被阻塞的情況下在單處理器上使用併發並沒有意義 cpu輪流給每個執行緒任務分配其占用...