C#/.NET 线程池ThreadPool多线程实现

点击此进入C#/.NET异步编程【目录】


线程池简介:

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

线程池实际调用

1 thread提供了太多的API 给三岁小孩一把枪 只给了一把筷子
2 无限使用线程,加以限制
3 重用线程,避免重复的创建和销毁

ThreadPool.QueueUserWorkItem(t => this.DoSomethingLong("btnThreadPool_Click"));

线程池里线程的执行不影响主线程的运行,线程池虽然可以管理多线程的执行,但是却无法知道它什么时候终止。这时候我们可以利用之前讲的信号灯AutoResetEvent和ManualResetEvent来解决问题

以下代码是引用别人的

public class Program
{
    const int cycleNum = 10;
    static int cnt = 10;
    static ManualResetEventmyEvent = new ManualResetEvent(false);
    static void Main(string[] args) 
    {
        for(int i = 1; i <= cycleNum; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString());
        }
        Console.WriteLine("主线程执行!");
        Console.WriteLine("主线程结束!");
        myEvent.WaitOne();
        Console.WriteLine("线程池终止!");
        Console.ReadKey();
    }
    public static void testFun(object obj)
    {
        cnt -= 1;
        Console.WriteLine(string.Format("{0}:第{1}个线程",DateTime.Now.ToString(),obj.ToString()));
        Thread.Sleep(5000);
        if (cnt == 0)
        {
            myEvent.Set();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老陈聊架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值