线程、线程池

Thread类:

1.线程创建出来目的是为了执行方法,因此需要给线程类的构造函数传递方法参数,这个参数就是一个委托。

2.调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间有CPU决定。

3. 线程分为前台线程和后台线程:

    只用所有的前台线程都关闭,程序才关闭;

    只要所有的前台线程都结束,后台线程自动结束。

    默认创建出来的线程都是前台线程,只有设置了线程的 IsBackground 属性为true,才为后台线程。

下面看Thread类其内部是怎么实现的:(部分代码)

public class Thread

{

       private ThreadStart  threadStart;                //定义一个TheadStart委托对象(原型: public delegate void  ThreadStart();)

       private ParameterizedThreadStart  paraThreadStart;   //定义ParameterizedThreadStart委托对象 ( 原型:public delegate void ParameterizedThreadStart(object obj);)

       public Thread(ThreadStart threadStart)

       {

              this.threadStart=threadStart;

       }

      //构造函数重载 (带参数委托)

       public Thread(ParameterizedThreadStart start)    

       {

             this.paraThreadStart=start;

       }

       //线程要执行,需提供一个start方法

      //调用Start方法,实际上是执行了委托

       public void Start()

       {

              this.threadStart(); 

        }

       //Start()的方法重载,带参数的委托方法参数从此Start方法中传入

        public void Start(object parameter)      //参数必须是object

        {

              this.paraThreadStart(parameter);

        }

}

--程序中是使用不带参数委托:

1. 先写线程执行的方法

public void  SayHi()

{}

2. 创建线程

ThreadStart threadStart = new ThreadStart(SayHi); //委托对象赋值

Thread thread = new Thread(threadStart);

3.开启线程

 thread.Start();

--程序中使用带参数委托 (参数可以是多个,用数组或集合实现)

1. 先写线程执行的方法

public void  SayHi(object name)

{

      Message.Show("name:"+name.ToString());

}

2. 创建线程

ParameterizedThreadStart paraThreadStart = new ParameterizedThreadStart(SayHi); //委托对象赋值

Thread thread = new Thread(paraThreadStart);

3.开启线程

thread.Start("Mike");

---------------------------------------------------------------------------------------------------------------

线程池

在程序中,如果创建某种对象所需要的代价太高,同时这个对象又可以反复使用,那么我们往往就会准备一个容器,用来保存一批这样的对象。

以后要用这种对象时,就不需要每次去创建一个,而直接从容器中取出一个现成的对象就可以了,提高程序性能!

显然线程就属于这种对象,故一般在程序中不直接通过new创建线程,而通过线程池获取。

用法:

用线程池中的线程 (只有当线程池中有空闲线程时才执行,否则在队列中等待)

ThreadPool.QueueUserWorkItem(new WaitCallback(WatchConn), sockWatch);

private void WatchConn(object obj) //参数类型为object

{

    //线程要执行的代码

}

原文地址:https://www.cnblogs.com/chay1227/p/2698048.html