多线程并行计算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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章