C#多线程(一)——简介

来源:互联网 发布:java函数的重载 编辑:程序博客网 时间:2024/05/11 12:23

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

 

Thread类有几个至关重要的方法,描述如下:

       Start():启动线程

       Sleep(int):静态方法,暂停当前线程指定的毫秒数

       Abort():通常使用该方法来终止一个线程

       Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复。

       Resume():恢复被Suspend()方法挂起的线程的执行

       Join():表示插入执行,比如有ab两个线程同时运行,那么应该是没有规则的交替式运行,也就是一会儿执行a一会儿执行b,如果在b线程中使用线程a调用了join方法,那么b就必须等待a执行完毕后才能执行。例如:

static void Main(string[] args)

        {

            //定义线程a

            Thread threada = new Thread(delegate()

            {

                for (int i = 0; i < 100; i++)

                {

                    Console.Write("1");

                }

            });

 

            //定义线程b

            Thread threadb = new Thread(delegate()

            {

                //b线程执行中调用a线程join

                threada.Join();

                for (int i = 0; i < 100; i++)

                {

                    Console.Write("2");

                }

            });

           

            //启动线程

            threada.Start();

            threadb.Start();

           

            Console.Read();

        }

首先注释掉Threada.Join();这段代码,执行结果如下:

 

取消Threada.Join()的注释,执行结果如下:

 

 

ThreadState在各种情况下的可能取值如下:

       Aborted:线程已停止

       AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止

       Background:线程在后台执行,与属性Thread.IsBackground有关

       Running:线程正在正常运行

       Stopped:线程已经被停止

       StopRequested:线程正在被要求停止

       Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行)

       SuspendRequested:线程正在要求被挂起,但是未来得及响应

       Unstarted:未调用Thread.Start()开始线程的运行

       WaitSleepJoin:线程因为调用了Wait(),Sleep()Join()等方法处于封锁状态

 

当线程之间争夺CPU时间时,CPU按照是线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是HighestAboveNormalNormalBelowNormalLowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。给一个线程指定优先级,我们可以使用如下代码:

  //设定优先级为最低

  myThread.Priority=ThreadPriority.Lowest;

IsBackground说明

当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程。后台线程将会随着主线程的推出而退出。后台线程不妨碍程序的终止,只要所有前台线程都终止后,CLR就会对每一个活在的后台线程调用Abort()来彻底终止应用程序。

当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的。也就是说,当主线程推出的时候,IsBackground=FALSE的线程还会继续执行下去,知道线程执行结束。只有IsBackground=TRUE的线程才会顺着主线程的推出而退出。

 

 

 

原创粉丝点击