1. 程式人生 > >線程池與並行度

線程池與並行度

資源 start 創建 sta tel span nds sys 不同的

本節將展示線程池如何工作於大量的異步操作,以及它與創建大量單獨的線程的方式有和不同。

代碼Demo:

using System;
using System.Threading;
using System.Diagnostics;

在Main方法下面加入以下代碼片段:

static void UseThreads(int numberOfOperations)
{
using (var countdown = new CountdownEvent(numberOfOperations))
{
Console.WriteLine("Scheduling work by creating threads");
for (int i = 0; i < numberOfOperations; i++)
{
var thread = new Thread(() =>
{
Console.WriteLine("{0},", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(TimeSpan.FromSeconds(0.1));
countdown.Signal();
});
thread.Start();
}
countdown.Wait();
Console.WriteLine();
}
}
static void UseThreadPool(int numberOfOperations)
{
using (var countdown = new CountdownEvent(numberOfOperations))
{
Console.WriteLine("Starting work on a threadpool");
for (int i = 0; i < numberOfOperations; i++)
{
ThreadPool.QueueUserWorkItem(_ =>
{
Console.WriteLine("{0},", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(TimeSpan.FromSeconds(0.1));
countdown.Signal();
});
}
countdown.Wait();
Console.WriteLine();
}
}

在Main方法中加入以下代碼片段:

const int numberOfOperations = 500;
var sw = new Stopwatch();
sw.Start();
UseThreads(numberOfOperations);
sw.Stop();
Console.WriteLine("Execution time using threads:{0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();

UseThreadPool(numberOfOperations);
sw.Stop();
Console.WriteLine("Execution time using threadpool:{0}", sw.ElapsedMilliseconds);

工作原理:

當主程序啟動時,創建了很多不同的線程,每個線程都運行一個操作。該操作打印出線程ID並阻塞線程100毫秒。結果我們創建了500個線程,全部並行運行這些操作。雖然在我的機器上的總耗時是300毫秒,但是所有線程消耗了大量的操作系統資源。

然後我們使用了執行同樣的任務,只不過部位每個操作創建一個線程,兒將他們放入到線程池中。然後線程池開始執行這些操作。線程池在快結束時創建更多的線程,但是仍然花費了更多的時間,在我機器上是12秒。我們為操作系統節省了內存和線程數,但是為此付出了更長的執行時間。

線程池與並行度