.net 4.0 中對多執行緒新特性(轉)
在4.0之前如果需要在多執行緒環境下操作集合型別的物件往往需要額為每種操作新增比較複雜的鎖機制才能保證每個執行緒對資源的訪問安全,在4.0的Collection名稱空間下面又多了一個新的名稱空間Concurrent,在這個名稱空間下面增加了幾個非常有用的執行緒安全的類:
BlockingCollection
ConcurrentBag
ConcurrentDictionary
ConcurrentQueue
ConcurrentStack
OrderablePartitioner
Partitioner 提供針對陣列、列表和可列舉項的常見分割槽策略。
Partitioner
通一個簡單的例子可以非常容易的來應用這些特性
class Program { static ConcurrentDictionary<int, int> dict = new ConcurrentDictionary<int, int>(); static void Main(string[] args) { for (int i = 0; i < 5; i++) { var thread = new Thread(new ThreadStart(Action)); thread.Start(); } Console.Read(); } static void Action() { var rd = new Random(); for (int i = 0; i < 10; i++) { Thread.Sleep(rd.Next(1, 5)); var k = dict.TryAdd(i, i); Console.WriteLine("Thread {0} add {1} {2}", Thread.CurrentThread.ManagedThreadId, i, ok ? "success" : "fail"); } } }
程式輸出如下:
Thread 11 add 0 success
Thread 11 add 1 success
Thread 12 add 0 fail
Thread 13 add 0 fail
Thread 11 add 2 success
Thread 12 add 1 fail
Thread 14 add 0 fail
Thread 12 add 2 fail
Thread 13 add 1 fail
…
從輸出結果我們看到在多執行緒競爭的情況下ConcurrentDictionary能夠很好的處理鎖競爭的問題。
生產消費模式在多執行緒中是非常常見的一種模式了,在4.0之前需要一套比較複雜的讀寫鎖來處理處理併發資源競爭的問題,在4.0中藉助BlockingCollection
static void Main(string[] args)
{
TestCase.Test();
Console.Read();
}
class TestCase
{
static ConcurrentBag
public static void Test()
{
var produce = new Thread(new ThreadStart(Produce));
var consume = new Thread(new ThreadStart(Consume));
produce.Start();
consume.Start();
}
static void Produce()
{
int index = 0;
while (true)
{
if (_bag.IsEmpty)
{
string productName = "Product " + index.ToString();
_bag.Add(new Product() { Name = productName });
Console.WriteLine("Produce Product {0} ", productName);
index += 1;
}
Thread.Sleep(1000);
}
}
static void Consume()
{
while (true)
{
if (!_bag.IsEmpty)
{
Product item;
if (_bag.TryTake(out item))
{
Console.WriteLine("Consume Product {0} " , item.Name);
}
}
Thread.Sleep(1000);
}
}
}
class Product
{
public string Name { get; set; }
}
程式輸出如下:
Consume Product Product 0
Produce Product Product 1
Consume Product Product 1
Produce Product Product 2
Consume Product Product 2
Produce Product Product 3
Consume Product Product 3
Produce Product Product 4
Consume Product Product 4
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-670846/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis 6.0 新特性-多執行緒連環13問!Redis執行緒
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- c++11 新特性實戰 (一):多執行緒操作C++執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- 多執行緒和多執行緒同步執行緒
- SpringBoot 對多執行緒的支援Spring Boot執行緒
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- 多執行緒--執行緒管理執行緒
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒
- Qt 中多執行緒對應的訊號槽QT執行緒
- Java中的多執行緒Java執行緒
- Java 21 新特性:虛擬執行緒(Virtual Threads)Java執行緒thread
- Android中的多程式、多執行緒Android執行緒
- Python中的多工:多執行緒Python執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 多執行緒系列(1),多執行緒基礎執行緒
- a、多執行緒執行緒
- Java8 新特性併發篇(一) | 執行緒與執行器Java執行緒
- .NET中各種執行緒同步鎖執行緒
- Java中多執行緒的案例Java執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- Java多執行緒之執行緒中止Java執行緒
- Android多執行緒之執行緒池Android執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 多執行緒之手撕執行緒池執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- JSRE中的多工與多執行緒JS執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- 多執行緒學習一(多執行緒基礎)執行緒