• 简单的线程池, 模版用



    线程池在VS2005中似乎没有数量限制,  但是WaitHandle.WaitAll()函数限制64线程. 需要超过的话可以使用嵌套线程.


    PS资料:
    CodeProject一篇关于线程池数量限制的文章.
    Changing the default limit of 25 threads of ThreadPool class




    using System;
    using System.Threading;
    public class Fibonacci
    {
        
    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();
        }
        
    // 线程计算过程 Recursive method that calculates the Nth Fibonacci number.
        public int Calculate(int n)
        {
            
    if (n <= 1)
            {
                
    return n;
            }
            
    return Calculate(n - 1+ Calculate(n - 2);
        }
        
    public int N { get { return _n; } }
        
    private int _n;
        
    public int FibOfN { get { return _fibOfN; } }
        
    private int _fibOfN;
        
    private ManualResetEvent _doneEvent;
    }
    public class ThreadPoolExample
    {
        
    static void Main()
        {
            
    const int FibonacciCalculations = 64;
            
    // 通知一个或多个正在等待的线程事件已经发生 ManualResetEvent
            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);
                Fibonacci f 
    = new Fibonacci(r.Next(2040), doneEvents[i]);
                fibArray[i] 
    = f;
                ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
            }
            
    // 等待线程池中所有计算完成
            WaitHandle.WaitAll(doneEvents);
            Console.WriteLine(
    "All calculations are complete.");
            
    // Display the results
            for (int i = 0; i < FibonacciCalculations; i++)
            {
                Fibonacci f 
    = fibArray[i];
                Console.WriteLine(
    "Fibonacci({0}) = {1}", f.N, f.FibOfN);
            }
            Console.ReadLine();
        }
    }
  • 相关阅读:
    20155209林虹宇虚拟机的安装及一点Linux的学习
    预备作业2林虹宇20155209
    预备作业01:你期望的师生关系是什么?
    20155203
    我眼中的师生关系以及对于专业学习的展望
    20155319的第一次随笔
    20155336 2016-2017-2《JAVA程序设计》第二周学习总结
    20155336 2016-2017-2《JAVA程序设计》第一周学习总结
    虎光元的第三次随笔
    20155336虎光元
  • 原文地址:https://www.cnblogs.com/Bird/p/671880.html
Copyright © 2020-2023  润新知