Atitit.併發編程原理與概論 attilax總結html
2. 線程安全性 ( 2.2 原子性 2.3 加鎖機制2程序員
2.1. 線程封閉3.3.1Ad-hoc線程封閉 3.3.2 棧封閉 3.3.3ThreadLocal類2算法
3. 異步2編程
5. 5.2 併發容器與併發集合2promise
7. 5.3 阻塞隊列和生產者-消費者模式(5.3.2 串行線程封閉 5.3.3 雙端隊列與工做密取 2安全
9. 5.5 同步工具類 5.5.1 閉鎖 5.5.2FutureTask5.5.3 信號量 5.5.4 柵欄 3
22.1. Java併發編程實戰(第16屆Jolt大獎提名圖書,Java併發編程必讀佳做8
22.4. Line 278: 《C++併發編程實戰》 Line 285: 第1章 你好,C++併發世界9
1. 多線程編程(已過期,不介紹)
2. 異步編程
3. 並行編程
4. 響應式編程
5. 數據流編程
做者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 )
漢字名:艾提拉(艾龍), EMAIL:1466519819@qq.com
轉載請註明來源: http://www.cnblogs.com/attilax/
第8章 線程池的使用
8.1 在任務與執行策略之間的隱性耦合
8.1.1 線程飢餓死鎖
8.1.2 運行時間較長的任務
8.2 設置線程池的大小
8.3 配置ThreadPoolExecutor
8.3.1 線程的建立與銷燬
8.3.2 管理隊列任務
8.3.3 飽和策略
8.3.4 線程工廠
7.1.1 中斷
7.1.2 中斷策略
7.1.3 響應中斷
7.1.4 示例:計時運行
7.1.5 經過Future來實現取消
7.1.6 處理不可中斷的阻塞
7.1.7 採用newTaskFor來封裝非標準的取消
7.2 中止基於線程的服務
7.2.1 示例:日誌服務
7.2.2 關閉ExecutorService
7.2.3 「毒丸」對象
7.2.4 示例:只執行一次的服務
7.2.5 shutdownNow的侷限性
7.3 處理非正常的線程終止
這四個概念對應在CLR中的本質,本質都是多線程。
異步,簡單的講就是BeginInvoke、EndInvoke模式,它在CLR內部線程池進行管理;
多線程,體如今C#中,能夠由類型Thread發起。也能夠由ThreadPool發起。前者不受CLR線程池管理,後者則是。FCL團隊爲了各類編程模型的方便,還另外提供了BackgroundWorker和若干個Timer,基本上它們都是ThreadPool的增強,增長了一些和調用者線程的交互功能;
任務(Task),爲FCL4.0新增的功能,在一個稱之爲任務並行庫(TPL)的地方,其實也就是System.Threading.Tasks命名空間下。任務並行庫名字取的很玄乎,其實它也是CLR線程池的增強。優化了線程間的調度算法,增長了和調用者線程的交互功能;
並行(Parallel),爲FCL4.0新增的功能,也屬於TPL。並行在後臺使用Task進行管理,說白了,由於Task使用的線程池線程,因此Parallel天然使用的也是線程池線程進行管理,它的本質僅僅是進一步簡化了Task。在這裏要增進一個對於並行的理解。實際上,多線程自然就是並行的。及時不用任務並行庫,用Thread類型新起兩個線程,CLR或者說Windows系統也會將這兩個線程根據須要安排到兩個CPU上去執行。因此,並非由於多了任務並行庫,CLR才支持並行計算,任務並行庫只是提供了一組API,使咱們可以更好的操縱線程進行並行開發而已。
若是你在FRAMEWORK4.0下編寫代碼,那麼應該按照這個優先級來撰寫多線程代碼:
優先 |
次優先 |
不得以 |
Parallel(含擴展庫PLinq) Task |
ThreadPool(BackgroundWorker,Timer) 異步 |
Thread |
這個表知足了大部分狀況下的一個優先級指導,但在某些狀況下會有例外。
多線程編程(已過期,不介紹)
異步編程就是使用future模式(又稱promise)或者回調機制來實現(Non-blocking on waiting)。
微軟還特地把異步編程分做了3種不一樣的模型:基於任務的模式(TAP)就是我上面推薦的這種,基於事件的模式(EAP)和異步編程模型(APM)我上面不推薦的事件和回調。
響應式編程最近成爲了一個Buzzword,其實微軟6年前就開始給.NET提供一個Reactive
Extensions了。一開始要理解響應式編程有點困難,可是一旦理解了,你就會對它的強大功能愛不釋手。簡單來講,響應式編程把事件流看做數據流,不過數據流是從IEnumable中拉取的,而數據流是從IObservable推送給你的。爲何響應式編程能夠實現併發呢?這是由於Rx作到線程不可知,每次事件觸發,後續的處理會從線程池中任意取出一個線程來處理。且能夠對事件設置窗口期和限流。舉個例子,你能夠用Rx來讓搜索文本框進行延遲處理(而不用相似我很早的時候用個定時器來延遲了)。
數據流(DataFlow)編程可能你們就更陌生了,不過仍是有些經常使用場景可使用數據流來解決。數據流實際上是在任務並行庫(TPL)上衍生出來的一套處理數據的擴展(也結合了異步的特性),TPL也是處理並行編程中任務並行和數據並行的基礎庫。
望文生義,TPL DataFlow就是對數據進行一連串處理,首先爲這樣的處理定義一套網格(mesh),網格中能夠定義分叉(fork)、鏈接(join)、循環(loop)。數據流入這樣的處理網格就可以並行的被處理。你能夠認爲網格是一種升級版的管道,實際上不少時候就是被看成管道來使用。使用場景能夠是「分析文本文件中詞頻」,也能夠是「處理生產者/消費者問題」。
Scala有Akka,其實微軟研究院也推出了Orleans來支持了Actor模型的實現,固然也有Akka.NET可用。Orleans設計的目標是爲了方便程序員開發須要大規模擴展的雲服務,
.2:什麼時候用異步,什麼時候用線程或線程池
這須要從「IO操做的DMA(Direct Memory Access)模式」講起。經過DMA的數據交換幾乎能夠不損耗CPU的資源。在硬件部分,硬盤、網卡、聲卡、顯卡等都有DMA功能。能夠簡單的認爲,當咱們的工做線程須要操做I/O資源的時候(如讀取一個大文件、讀取一個網頁、讀取Socke包等),咱們就須要用異步去作這些事情。異步模式只會在工做開始以及工做結束的時候佔用CLR線程池,其它時候由硬盤、網卡等硬件設備來處理具體的工做,這就不會過多佔用到CPU空間和時間損耗。
歸納而言:
計算密集型工做,直接採用線程;
IO密集型工做,採用異步機制;
當咱們不清楚什麼工做是I/O密集型的,一個不是很恰當的指導就是:查看FCL類型成員,若是成員提供了相似BeginDosomething方法的,則優先使用它,而不是新起一個線程或丟到線程池。
3.4:什麼時候用Thread
以上的各類線程模型,它們最終都是Thread。 那麼何時須要Thread直接出場呢?
最重要的使用Thread的理由是,咱們須要控制線程的優先級。Thread之上的線程模型都不支持優先級設置。設置一個線程的高優先級可使它得到更多的CPU時間;
再者,能夠控制線程爲前臺線程。固然,由Thread新起的線程默認就是前臺線程。前臺線程不隨着調用者線程的中斷而中斷,這使得咱們能夠用Thread來進行一些關鍵性的操做。
做者:Brian Goetz,Tim Peierls,Joshua Bloch,Joseph Bowbeer,David Holmes,Doug Lea 著,童雲蘭 等譯
第1章 簡介
第2章 線程安全性
第3章 對象的共享
第4章 對象的組合
第5章 基礎構建模塊
第6章 任務執行
第7章 取消與關閉
第8章 線程池的使用
第9章 圖形用戶界面應用程序
第10章 避免活躍性危險
第11章 性能與可伸縮性
第12章 併發程序的測試
第13章 顯式鎖
第14章 構建自定義的同步工具
第15章 原子變量與非阻塞同步機制
第16章 Java內存模型
Executor框架
第1章 線程基礎 ( lock關鍵字 1.11 使用Monitor類鎖定資源
第2章 線程同步
第3章 使用線程池
第4章 使用任務並行庫
第5章 使用C# 5.0
第6章 使用併發集合
第7章 使用PLINQ
第8章 使用Reactive Extensions
第9章 使用異步I/O
第10章 並行編程模式
第11章 更多信息
Line 300: 第2章 管理線程
Line 311: 第3章 在線程間共享數據
Line 329: 第4章 同步併發操做
Line 348: 第5章 C++內存模型和原子
Line 370: 第6章 設計基於鎖的併發數據結構
Line 380: 第7章 設計無鎖的併發數據結構
第1 章 併發編程概述
第2 章 異步編程基礎
第3 章 並行開發的基礎
第4 章 數據流基礎
第5 章 Rx 基礎
第6 章 測試技巧
第7 章 互操做
第8 章 集合
第9 章 取消
第10 章 函數式OOP
第11 章 同步
第12 章 調度
第13 章 實用技巧
參考資料
異步、多線程、任務、並行編程之一:選擇合適的多線程模型 - Luminji - 博客園.html
我爲何喜歡用C#來作併發編程-博客-雲棲社區-阿里雲.html
atiend