using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApp2
{
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);
}
}
public class ThreadPoolExample
{
static void Main()
{
const int FibonacciCalculations = 5;
//事件用于每个fabonacci对象
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);//如果为true,就是一开始就执行
Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);
fibArray[i] = f;
//使用线程池调用函数
ThreadPool.QueueUserWorkItem(f.ThreadPoolCallBack, i);//此处的i就是ThreadPoolCallBack方法的object参数
}
//等待线程池中线程的运算
WaitHandle.WaitAll(doneEvents);//等待时间数组中每一个线程都为set发送状态的时候才继续运行,否则阻塞在这里
Console.WriteLine("All calculations are complete.");
//显示结果
for (int i = 0; i < FibonacciCalculations; i++)
{
Fibonacci f = fibArray[i];
Console.WriteLine("Fibonacci({0}) = {1}.", f.N, f.FibofN);
}
Console.Read();
}
}
}
c#线程池实例
最新推荐文章于 2024-08-09 20:31:50 发布