首页 > 代码库 > 了解线程

了解线程

  • 相关概念

 

  1. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
  2. 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
  3. 多线程指在一个进程中同时运行多个线程完成不同的工作;多线是并发的一种。
  • c#创建线程

        1.Thread类提供了两个构造实例,一个是接受输入参数的委托,一个不需要输入参数的委托

             技术分享

         2.分别创建两个线程如

            //初始化线程实例             Thread thread = new Thread(() =>            {                Thread cThread = Thread.CurrentThread;                cThread.Name = "thread";                Console.WriteLine("启动线程不需要传递数据线程信息:id:{0}/name:{1}/state:{2}",                cThread.ManagedThreadId, cThread.Name, cThread.ThreadState);            });            thread.Start();            //初始化线程实例 提供参数            Thread threadWithPara = new Thread(x =>            {                Thread cThread = Thread.CurrentThread;                Console.WriteLine("启动线程需要传递数据线程信息:id:{0}/name:{1}/state:{2}/paraData:{3}",                 cThread.ManagedThreadId, cThread.Name, cThread.ThreadState, x);            });            threadWithPara.Name = "threadWithPara";            threadWithPara.Start("objectData");

输出:技术分享

  • 前台线程和后台线程

         clr将每个线程要么视为前台线程,要么视为后台线程。当一个进程的所有前台线程执行完成,主程序运行结束,不管后台线程有没有执行完毕都会被终止且不会抛出异常。

 以下代码演示了前台和后台线程之间的差异:

        public static void RunDiff()        {            BackgroundTest();            ForegroundTest();            Console.WriteLine("主线程执行结束");        }        public static void BackgroundTest()        {            Thread backgroundThread = new Thread((objectData) =>            {                //模式1秒的其他工作   因为是后台线程不会执行到这里                Thread.Sleep(1000);                Console.WriteLine("输入出后台线程参数:" + objectData.ToString());            });            //使线程成为后台线程            backgroundThread.IsBackground = true;            backgroundThread.Start("hi  backgroundThread");        }        public static void ForegroundTest()        {            //创建线程(默认为前台线程)            Thread backgroundThread = new Thread((objectData) =>            {                //Thread.Sleep(2000);  // 如果把屏蔽去掉 后台线程输出将会看到。                Console.WriteLine("输入出 前台线程参数:" + objectData.ToString());            });            backgroundThread.Start("hi  foregroundThread");        }

 

了解线程