C# ThreadPool.QueueUserWorkItem典型案例详解

C# ThreadPool.QueueUserWorkItem典型案例详解今天在博客园拜读了  蒋金楠,难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?自己也深有启发,决定再次陈述个人理解。 我自己差不多写了一段源码,类似蒋金楠那篇博文中的:usingSystem;usingSystem.Collections.Generic;usingSystem.Threading;namespac

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

今天在博客园拜读了   蒋金楠难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?自己也深有启发,决定再次陈述个人理解。

  我自己差不多写了一段源码,类似蒋金楠那篇博文中的:

using System;
using System.Collections.Generic;
using System.Threading;

namespace ThreadPoolTest
{

    class Program
    {

        static void Main(string[] args)
        {

            //声明一个Action委托的List,添加一些委托测试用
            List<Action> actions = new List<Action>
            {

                ()=>{Console.WriteLine(“A-1”);},
                ()=>{Console.WriteLine(“A-2”);},
                ()=>{Console.WriteLine(“A-3”);},
                ()=>{Console.WriteLine(“A-4”);}
            };
            //遍历输出结果
            foreach (var action in actions)
            {

                ThreadPool.QueueUserWorkItem(state => action() , null);

            }
            Console.ReadKey();
        }
    }
}

这个很意外的结果如下:

C# ThreadPool.QueueUserWorkItem典型案例详解

为什么如此呢:

    我分析下,首先大家都知道创建一个线程是需要时间的,线程池作为一个管理线程的对象操作简单,但是涉及到具体细节的时候却很难控制,其原理是当线程池收到请求以后,则从线程池中找到一个闲的线程分配给它,然后启动。 但是线程池的线程从创建到启动需要时间,但是主线程的循环显然只是瞬间完成,完全没必要夹杂在线程池的等待中,因此出现了主线程执行完循环最后是的线程池收到的请求委托是列表中的最后一个,如何解决?

方式一:   Thread.Sleep(1);

   博主说对于Thread.Sleep(N)的方式难以接受,其实只要细细去分析原理,就能知道这个方式是可以接受甚至是微妙的,Thread.Sleep(N)是对当前线程阻塞一定时间,那这个处理不论是主线程还是线程池中的线程都是有效果的,至少为线程池中的线程的请求与启动赢得了时间。当然在这里阻塞的线程一定是主线程,使其不能得到CPU时间,这样也就成功了得到预期结果。

  后来又采取另外一种方式,

方式二:

           foreach (var action in actions)
            {

                var Tempaction = action;
                ThreadPool.QueueUserWorkItem(state => Tempaction() , null);     
            }

   将循环中的变量存储到一个临时变量中,为什么这样行呢?

   大家知道线程池是有请求就为其分配一个自由线程与其工作,当每一次循环中的变量不同也就是对象不同时这时候每次请求出现差异,当然线程池必须为每一个做准备,不同于把循环变量直接作为请求,这时候每一个请求就按顺序依次准备好依次启动。当然也就成功了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189892.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 进程和线程的深入理解

    进程和线程的深入理解进程和线程的深入理解,从抽象类比到与原理,阐述了两者的区别

    2022年7月25日
    10
  • 怎么创建自己的网站?创建自己网站的步骤「建议收藏」

    怎么创建自己的网站?创建自己网站的步骤「建议收藏」随着互联网的不断发现,越来越多的个人站长在互联网上获得不错的流量。也有很多的企业通过自己搭建网站创建属于自己的企业网站,也获得不错的效果。在互联网风口上,如果你还不做一个网站,那真的损失太大了。为了让广大互联网工作中获利今天牛商网就为大家解答怎么创建自己的网站?创建自己网站的步骤有哪些?1、自己建站第一步:购买域名和服务器。网站的域名和服务器是一个网站的基础配件,域名就相当于你网站的地址,当别人输入你的域名的时候就可以访问你的网站。而服务器就相当于一个房子,用来存放你网站的文件和内容的。同时域名和

    2022年6月18日
    29
  • PyCharm激活码永久有效PyCharm2017.3.7激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2017.3.7激活码教程-持续更新,一步到位PyCharm激活码永久有效2017.3.7激活码教程-Windows版永久激活-持续更新,Idea激活码2017.3.7成功激活

    2022年6月19日
    25
  • Android下基于Iptables的一种app网络访问控制方案(一)[通俗易懂]

    Android下基于Iptables的一种app网络访问控制方案(一)[通俗易懂]1.什么是Iptable?百度百科对于Iptables有详细的介绍。简单地说,Iptables是Linux内核提供的一套IP信息包过滤系统,对外由Iptables命令提供设置过滤规则的入口。Android是基于Linux的操作系统,支持Iptables。执行Iptables命令需要root权限。 2.如何配置Iptables命令链?假设一个安卓系统网络访问管理体系,需要针对不同

    2022年7月23日
    9
  • 建索引的优缺点

    建索引的优缺点参考:https://blog.csdn.net/ybaog/article/details/53906300为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。…

    2022年5月10日
    43
  • iptables防封_iptables屏蔽ip

    iptables防封_iptables屏蔽ipiptables封掉少量ip处理是没什么问题的,但是当有大量ip攻击的时候性能就跟不上了,iptables是O(N)的性能。而ipset就像一个集合,把需要封闭的ip地址放入这个集合中,ipset是O(1)的性能,用的hash方式所以特别快。ipset的一个优势是集合可以动态的修改,即使ipset的iptables规则目前已经启动,新加的入ipset的ip也生效。一、软件及安装  1…

    2022年9月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号