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();