摘要
线程池是一种多线程的形式,其中的任务被添加到队列中,并在创建线程时自动启动。
以下示例使用.Net框架的线程池来计算十个数字20和40之间的裴波那契的结果。裴波那契Fibonacci类,它提供了一种方法叫ThreadPoolCallback执行计算。一个对象表示一个裴波那契的值被创建,ThreadPoolCallback方法是通过queueuserworkitem分配可能的线程池中执行的方法。
因为每个裴波那契对象提供一个半随机值来计算,因为每个线程将竞争处理器时间,你不能提前知道多久将采取所有是个结果来计算。这就是为什么每个裴波那契对象传递的manualresetevent类的一个实例在施工。每个对象的信号提供的事件对象计算完成,这使主线程阻止执行waitall直到所有的裴波那契对象计算结果。然后main函数显示结果。
一个例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ThreadPoolDemo
{
class Program
{
static void Main(string[] args)
{
const int FibonacciCalculations = ;
ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];
Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
Random r = new Random();
Console.WriteLine("launching {0} tasks...", FibonacciCalculations);
for (int i = ; i < FibonacciCalculations; i++)
{
doneEvents[i] = new ManualResetEvent(false);
Fibonacci f = new Fibonacci(r.Next(, ), doneEvents[i]);
fibArray[i] = f;
ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
}
//wait for all threads in pool to calculate
WaitHandle.WaitAll(doneEvents);
for (int i = ; i < FibonacciCalculations; i++)
{
Fibonacci f = fibArray[i];
Console.WriteLine("Fibonacci({0})={1}", f.N, f.FibofN);
}
Console.Read();
}
}
public class Fibonacci
{
private int _n;
private int _fibofN;
private ManualResetEvent _doneEvent;
public int N { get { return _n; } }
public int FibofN { get { return _fibofN; } }
public Fibonacci(int n, ManualResetEvent doneEvent)
{
_n = n;
_doneEvent = doneEvent;
}
public void ThreadPoolCallback(object threadContext)
{
int threadIndex = (int)threadContext;
Console.WriteLine("thread {0} started....", threadIndex);
_fibofN = Calculate(_n);
Console.WriteLine("thread {0} result calculated...", threadIndex);
_doneEvent.Set();
}
public int Calculate(int n)
{
if (n <= )
{
return n;
}
return Calculate(n - ) + Calculate(n - );
}
}
}
结果
参考