博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池
阅读量:2429 次
发布时间:2019-05-10

本文共 3399 字,大约阅读时间需要 11 分钟。

线程池

 “线程池”是可以用来在后台执行多个任务的线程集合。这使主线程可以自由地异步执行其他任务。

线程池通常用于服务器应用程序。每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理。
一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程的开销。
线程池通常具有最大线程数限制。如果所有线程都繁忙,则额外的任务将放入队列中,直到有线程可用时才能够得到处理。
您可以实现自己的线程池,但是通过 ThreadPool 类使用 .NET Framework 提供的线程池更容易一些。
下面的示例使用 .NET Framework 线程池计算 20 和 40 之间的十个数的 Fibonacci 结果。每个 Fibonacci 结果都由 Fibonacci 类表示,该类提供一种名为 ThreadPoolCallback 的方法来执行此计算。将创建表示每个 Fibonacci 值的对象,ThreadPoolCallback 方法将传递给 QueueUserWorkItem,它分配池中的一个可用线程来执行此方法。
由于为每个 Fibonacci 对象都提供了一个半随机值来进行计算,而且十个线程都将竞争处理器时间,因此无法提前知道十个结果全部计算出来所需的时间。因此在构造期间为每个 Fibonacci 对象传递 ManualResetEvent 类的一个实例。当计算完成时,每个对象都通知提供的事件对象,使主线程用 WaitAll 阻止执行,直到十个 Fibonacci 对象全部计算出了结果。然后 Main 方法将显示每个 Fibonacci 结果。

 

 

using System;using System.Threading;public class Fibonacci{    private int _n;    private int _fibOfN;    private ManualResetEvent _doneEvent;    public int N { get { return _n; } }    public int FibOfN { get { return _fibOfN; } }    // Constructor.    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 start 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 calculate.        WaitHandle.WaitAll(doneEvents);        Console.WriteLine("All calculations are complete.");        // Display the results.        for (int i= 0; i

下面是运行结果

 

launching 10 tasks...thread 0 started...thread 1 started...thread 1 result calculated...thread 2 started...thread 2 result calculated...thread 3 started...thread 3 result calculated...thread 4 started...thread 0 result calculated...thread 5 started...thread 5 result calculated...thread 6 started...thread 4 result calculated...thread 7 started...thread 6 result calculated...thread 8 started...thread 8 result calculated...thread 9 started...thread 9 result calculated...thread 7 result calculated...All calculations are complete.Fibonacci(38) = 39088169Fibonacci(29) = 514229Fibonacci(25) = 75025Fibonacci(22) = 17711Fibonacci(38) = 39088169Fibonacci(29) = 514229Fibonacci(29) = 514229Fibonacci(38) = 39088169Fibonacci(21) = 10946Fibonacci(27) = 196418

 

 

 

 

 

 

转载地址:http://kpnmb.baihongyu.com/

你可能感兴趣的文章
SpringCloud全家桶---注册中心Eureka搭建
查看>>
SpringCloud全家桶---注册中心Eureka高可用环境搭建
查看>>
SpringCloud全家桶---客户端负载均衡Ribbon
查看>>
SpringCloud全家桶---OpenFeign
查看>>
链表算法面试题---反转链表
查看>>
链表算法面试题---删除链表节点
查看>>
Linux安装MySQL5.7详细步骤
查看>>
链表算法面试题---用链表实现队列和栈
查看>>
SpringCloud全家桶---断路器Hystrix
查看>>
深入理解什么是Java双亲委派模型
查看>>
JVM缓存行对齐性能优化
查看>>
Redis主从环境详细搭建过程
查看>>
深入分析Redis主从复制原理
查看>>
【设计模式实践系列】观察者模式
查看>>
Spring中ApplicationListener监听器设计解析
查看>>
InnoDB共享、排他、意向、间隙锁机制
查看>>
JVM对象TLAB分配、栈上分配性能测试
查看>>
JVM调优实战系列---堆内存分配优化
查看>>
Redis哨兵环境搭建与详细分析
查看>>
CentOS搭建MySQL主从环境详细过程
查看>>