ThreadPool学习

ThreadPool:提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

ThreadPool类在需要时增减池中线程的线程数,直到最大的线程数(可通过ThreadPool.GetMaxThreads获得)。

将任务添加进线程池:
       ThreadPool.QueueUserWorkItem(Callback);
重载:
      ThreadPool.QueueUserWorkItem(Callback, state);
      因为ThreadPool是静态类 所以不需要实例化.

回调方法:

       必须匹配System.Threading.WaitCallback委托类型,其定义为 delegate void Callback(object state);   可以向方法传递一个state参数;若没有参数,默认传递null。


        如下面的示例所示,在for循环中,调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallBack类型的委托,将JobForAThread方法传递给线程池中的线程。在线程池收到这个请求时,会从池中选取一个线程来调用该方法。如果线程池还没有运行,则创建一个线程池,并启动第一个线程。如果线程池已经在运行,且有一个空线程来完成该任务,则把该任务传递给这个线程。


        static void Main(string[] args)
        {
            int nWorkerThreads;
            int nCompletionPortThreads;

            ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionPortThreads);
            Console.WriteLine("Max worker threads: {0}, I/O completion threads: {1}", nWorkerThreads, nCompletionPortThreads);

            for (int i = 0; i < 5; i++)
            {
                ThreadPool.QueueUserWorkItem(JobForAThread);
            }
            Thread.Sleep(1000);

            Console.ReadKey();
        }

        static void JobForAThread(object state)
        {
            for (int i = 0; i < 3; i++)
            {
                //获取托管线程的唯一标识符
                Console.WriteLine("Loop {0}, running inside pooled thread {1}", i, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(50);
            }
        }



线程池的特点:

         1 线程池中所有的线程都是后台线程。如果进程的前台线程都结束了,则所有的后台线程会停止;

         2 不能给线程池中的线程设置优先级或名称;

         3 入池的线程只能用于时间较短的任务,如果线程要一直运行,则使用Thread类创建一个线程。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值