• 线程池(ThreadPool)


    线程池(ThreadPool)

    一、简介

    前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上来讲,这样做并不理想(因为每使用一个线程就要创建一个,需要占用系统开销);从操作上来讲,每次都要启动,比较麻烦。为此引入的线程池的概念。
    好处:
    1.减少在创建和销毁线程上所花的时间以及系统资源的开销
    2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
    在什么情况下使用线程池?
    1.单个任务处理的时间比较短
    2.需要处理的任务的数量大
    线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000。通过线程池创建的线程默认为后台线程,优先级默认为Normal。

    二、代码

    案例一:

     class Program
        {
            static void Main(string[] args)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod1), new object());    //参数可选
                Console.ReadKey();
            }
    
            public static void ThreadMethod1(object val)
            {
                for (int i = 0; i <= 10000; i++)
                {
                    if (i % 1000 == 0)
                    {
                        if (string.IsNullOrEmpty(Thread.CurrentThread.Name) )
                        {
                            Thread.CurrentThread.Name = "Thred_" + i;
                        }
                        Console.WriteLine("循環{0}次的線程的線程名稱為:{1}",i,Thread.CurrentThread.Name);
                    }
                }
            }
        }

    运行结果:

    案例二:

       class Program
        {
            public static void Main()
            {
                // Queue the task.
                ThreadPool.QueueUserWorkItem(ThreadProc);
                Console.WriteLine("Main thread does some work, then sleeps.");
                Thread.Sleep(1000);
    
                Console.WriteLine("Main thread exits.");
                Console.ReadKey();
            }
    
            // This thread procedure performs the task.
            static void ThreadProc(Object stateInfo)
            {
                // No state object was passed to QueueUserWorkItem, so stateInfo is null.
                Console.WriteLine("Hello from the thread pool.");
            }
        }

    运行结果:


    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    我创建了一个.NET开发交流群,用于分享学习心得和讨论相关技术难题。欢迎有兴趣的小伙伴扫码入群,相互学习!

  • 相关阅读:
    IDEA怎么自动生成serialVersionUID
    使用gcc的-l参数的时候,怎么查找函数所在库的位置
    有一个10 G 的文件,你只有有一个 2 G 的内存,找出重复最多的数字
    gdb调试使用教程
    使用autoscan自动生成makefile文件
    如何查看yum命令安装的软件的安装目录
    手机QQ邮箱app有未读邮件,图标右上角没有红色小圆点的解决方案
    谷歌google帐号(邮箱)注册时,提示此电话号码无法用于验证
    Notepad++编写的shell脚本在linux下无法执行的解决方法
    linux如何配置普通用户(非root用户)的sudo权限
  • 原文地址:https://www.cnblogs.com/wml-it/p/14822883.html
Copyright © 2020-2023  润新知