多線程並行計算Fibonacci(互相分開,無數據交流)

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

發佈了26 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章