zoukankan      html  css  js  c++  java
  • c#的ThreadPool使用笔记(一)

    摘要:
    系列文章,从一个基本的代码说起,逐步探索 ThreadPool 的奥妙。

    首先,看看线程池的样子:

    从上图看出,线程池维护1个至n个线程,操作系统从请求队列中提取请求分配个线程池中的适合线程处理。

    先写下如下的代码:

    using System;
    using System.Threading;

    public class ThreadBase
    {
        
    public static void Main ( ) {

            System.Threading.WaitCallback waitCallback 
    = new WaitCallback ( MyThreadWork );

            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第一个线程" );
            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第二个线程" );
            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第三个线程" );
            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第四个线程" );
            Console.ReadLine ( );
        }


        
    public static void MyThreadWork ( object state ) {
            Console.WriteLine ( 
    "线程现在开始启动…… {0}",(string)state );
            Thread.Sleep ( 
    10000 );
            Console.WriteLine ( 
    "运行结束…… {0}",( string ) state );
        }

    }
    分析上面的代码:
    一、首先定义了一个 System.Threading.WaitCallback 对象 waitCallback。 
    WaitCallback 是一个委托,表示线程池线程要执行的回调方法,它的原型如下:
    [ComVisibleAttribute(true)] 
    public delegate void WaitCallback (
        Object state
    )
    1、这里有一个 Callback 机制的问题,所谓的Callback 简单的理解就是由操作系统调用的函数,我们自己写的程序不需要调用。就像有个修理工到家里搞修理,你只需要告诉他钳子、螺丝刀、胶布等修理工具在什么地方就行,而不要管他在什么时候、在什么地方怎样使用这些修理工具。
    2、WaitCallback 的参数" Object state",这个参数包含回调方法要使用的信息的对象。在接下来的情况中我再说。
    既然 WaitCallback 委托的原型如此,那么我们就申明一个跟它的样子差不多的函数,这个函数就是要线程做的事情。
    public static  void MyThreadWork ( object state )

    这里函数中多了一个 "static",这是因为Main的关系(更大一点就是因为C#语言机制的问题),如果WaitCallback 的对象不是在静态(static)方法中,这个static 是不需要的。

    二、接着就是要执行的方法放入线程池中,以便操作系统执行。
    我这里放置了四个方法要操作系统执行:
            ThreadPool.QueueUserWorkItem ( waitCallback, "第一个线程" );
            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第二个线程" );
            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第三个线程" );
            ThreadPool.QueueUserWorkItem ( waitCallback, 
    "第四个线程" );
    这里,我放置到线程池中的操作是一样的,当然也可以不一样,接下来说。

    三、最后阻塞主线程,等待线程池中的线程执行
     Console.ReadLine ( );
    如果忽略掉这个代码,则有可能看不到任何输出

    好了,这是主线程做的事情了,接下来看看线程池中的线程做的事情。
    这个很简单,就是将线程的参数输出,然后线程睡眠(sleep)一段时间,最后输出线程结束的信息。
  • 相关阅读:
    jquery类似方法的比较(二)
    获取数组中最大值的方法(最小值同理)
    jquery类似方法的比较(一)
    余老板
    N小时改变一次url时间戳的方法
    元素的前后关系
    损失函数, 成本函数, 目标函数的区别
    Ternsorflow 学习:005-MNIST入门 实现模型
    arm linux 移植支持 HP打印机
    在Anaconda3环境下安装并切换 Tensorflow 2.0 环境
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2034713.html
Copyright © 2011-2022 走看看