Fibonacci类代码如下:
using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
namespace Threadtest1
{
//接收数据,运行时算法,定义线程池方法,提供调用!
public class Fibonacci
{
private int _n;
private int _fibOfN;
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); //显示最后结果第n个fb数
Console.WriteLine("thread {0} result is already receive...", threadIndex);
//得到结果,终止线程事件
_doneEvent.Set();
}
// 计算第 N 个斐波纳契数的递归方法。
public int Calculate(int n)
{
if (n <= 1)
{
return n;
}
else
{
return Calculate(n - 1) + Calculate(n - 2);
}
}
}
public static class ThreadPoolExample
{
public static void duoxiancheng()
{
const int FibonacciCalculations = 2;
// 每个 Fibonacci 对象使用一个ManualResetEvent事件
ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];
Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
//伪随机数生成函数
Random r = new Random();
// 使用 ThreadPool 配置和启动线程:
Console.WriteLine("以 {0} 线程启动...", FibonacciCalculations);
Fibonacci f;
int v1 = 20, v2 = 30;
for (int i = 0; i < FibonacciCalculations; i++)
{
int v;
//if (i == 0) { v = v1; } else { v = v2; }
switch (i)
{
case 0: v = v1; break;
case 1: v = v2; break;
default: v = 1; break;
}
doneEvents[i] = new ManualResetEvent(false); //事件设为不终止
//Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);
f = new Fibonacci(v, doneEvents[i]);
//将n和事件传递给fb的new方法 实例化f
fibArray[i] = f; //f作为中间参数有意义么?!!!
ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
//将f的线程调用方法压入线程池,开始执行
}
//doneEvents[1] = new ManualResetEvent(false);
////Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);
//f = new Fibonacci(10, doneEvents[1]);
//fibArray[1] = f;
//ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, 1);
//doneEvents[2] = new ManualResetEvent(false);
////Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);
//f = new Fibonacci(10, doneEvents[2]);
//fibArray[2] = f;
//ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, 2);
// 等待池中的所有线程执行计算...
WaitHandle.WaitAll(doneEvents);
// 显示结果...
Console.WriteLine("线程运行结束,结果为:");
for (int i = 0; i < FibonacciCalculations; i++)
{
Fibonacci g = fibArray[i];
Console.WriteLine("Fibonacci({0}) = {1}", g.N, g.FibOfN);
}
}
}
}
在主方法中添加语句调用:
ThreadPoolExample.duoxiancheng();