摘要
线程池是一种多线程的形式,其中的任务被添加到队列中,并在创建线程时自动启动。
以下示例使用.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 = 10; ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations]; Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations]; Random r = new Random(); Console.WriteLine("launching {0} tasks...", FibonacciCalculations); for (int i = 0; i < FibonacciCalculations; i++) { doneEvents[i] = new ManualResetEvent(false); Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]); fibArray[i] = f; ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i); } //wait for all threads in pool to calculate WaitHandle.WaitAll(doneEvents); for (int i = 0; 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 <= 1) { return n; } return Calculate(n - 1) + Calculate(n - 2); } } }
结果
参考
https://msdn.microsoft.com/en-us/library/mt679040.aspx
时间: 2024-11-10 07:04:10