线程池用法的改进

 在MSDN关于使用线程池的一个例子(见http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx).程序如下:

using System;
using System.Threading;

public class Fibonacci
{
    public int N { get { return _n; } }
    private int _n;

    public int FibOfN { get { return _fibOfN; } }
    private int _fibOfN;

    private ManualResetEvent _doneEvent;

    public Fibonacci(int n, ManualResetEvent doneEvent)
    {
        _n = n;
        _doneEvent = doneEvent;
    }

    // Wrapper method for use with thread pool.
    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 class ThreadPoolExample
{
    static void Main()
    {
        const int FibonacciCalculations = 10;

        // One event is used for each Fibonacci object
        ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];
        Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
        Random r = new Random();

        // Configure and launch threads using ThreadPool:
        Console.WriteLine("launching {0} tasks...", FibonacciCalculations);
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            doneEvents[i] = new ManualResetEvent(false);
            Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);
            fibArray[i] = f;
            ThreadPool.QueueUserWorkItem(new WaitCallback ( f.ThreadPoolCallback), i);
        }

        // Wait for all threads in pool to calculation...
        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();
    }
}

以上例子是利用多线程的线程池技术进行批处理的经典范例,在实际应用中稍加改动就可以实现自己所需的功能,但遗憾的是,如果批处理的任务数大于64个时,程序运行就会出错,提示"WaitHandles 的数目必须少于或等于 64 个."以上例而言,将"const int FibonacciCalculations = 10;"改为"const int FibonacciCalculations = 65;"后再运行就会出错,这确实是一个不足,因为在实际工作中很多情况下需要用线程池技术批量处理64个以上的任务,怎么办呢?经过分析,对以上程序做了一些改动,解决了这个问题,而且程序的结构更简单,也不再需要使用 ManualResetEvent 对象,修改后的程序如下: 

using System;
using System.Threading;

public class Fibonacci
{
    public int N { get { return _n; } }
    private int _n;
    public int ifdone = 0;   //注意这里

    public int FibOfN { get { return _fibOfN; } }
    private int _fibOfN;

 
    public Fibonacci(int n)
    {
        _n = n;
 
    }

    // Wrapper method for use with thread pool.
    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);
     //   注意这里

        ifdone = 1;
    }

    // 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 class ThreadPoolExample
{
    static void Main()
    {
        const int FibonacciCalculations = 128;
        Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
        Random r = new Random();

        Console.WriteLine("launching {0} tasks...", FibonacciCalculations);
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            Fibonacci f = new Fibonacci(r.Next(20, 40));
            fibArray[i] = f;
            ThreadPool.QueueUserWorkItem(new WaitCallback ( f.ThreadPoolCallback), i);
        }
         //注意这里
        while (true)
        {
            int counts = 0;
            for (int i = 0; i < FibonacciCalculations; i++) counts=counts+fibArray[i].ifdone ;
            if (counts == FibonacciCalculations) break;
        }
  

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值