• 线程池的实现


       多线程

       优点:

             在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

       缺点:

               线程也是程序,所以线程需要占用内存,线程越多占用内存也越多

           多线程需要协调和管理,所以需要CPU时间跟踪线程

           线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题

           线程太多会导致控制太复杂,最终可能造成很多Bug

    ThreadPool.SetMaxThreads方法

    设置线程池中同步可以活动的线程的最大数量. 所以超过这个数据的其它线程,必须等待其它线程完成后方可激活。

    You cannot set the number of worker threads or the number of I/O completion threads to a number smaller than the number of processors in the computer.

    例子原代码下载

    Example

    using System;

    using System.Threading;



    public class Fibonacci

    {

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

    }


    }


    }

    Sample Output

    launching 10 tasks...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    result calculated...
    all calculations complete
    Fibonacci(22) = 17711
    Fibonacci(25) = 75025
    Fibonacci(32) = 2178309
    Fibonacci(36) = 14930352
    Fibonacci(32) = 2178309
    Fibonacci(26) = 121393
    Fibonacci(35) = 9227465
    Fibonacci(23) = 28657
    Fibonacci(39) = 63245986
    Fibonacci(22) = 17711


    详见于MSDN http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx
  • 相关阅读:
    Flask基本介绍
    【Maven】使用Maven构建多模块项目
    spring data jpa 详解
    request.getParameterNames()和request.getParameterValues()
    JAVA字符串格式化-String.format()的使用
    Java中的String,StringBuilder,StringBuffer三者的区别
    Java总结篇系列:Java泛型
    <c:forEach>详解
    Spring MVC 相关资料整理
    关于${pageContext.request.contextPath}的理解 (转载)
  • 原文地址:https://www.cnblogs.com/luyinghuai/p/1255784.html
Copyright © 2020-2023  润新知