zoukankan      html  css  js  c++  java
  • 线程、线程池

    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

    {

        //线程要执行的代码

    }

  • 相关阅读:
    企业级应用和互联网应用的区别
    软件工程项目输出
    学习软件工程学习报告以及心得体会
    第一结对项目(黄金点游戏)(仝国庆,钱同林)
    github网页链接
    第二周代码(wc项目)
    使用filter进行用户登录
    关于JSP
    关于XML
    Java EE第一课
  • 原文地址:https://www.cnblogs.com/chay1227/p/2698048.html
Copyright © 2011-2022 走看看