bicabo C#多线程详解(三)

继续上一节的问题:调换两个新创建的线程启动顺序会是什么结果?

using System;

using System.Threading;

namespace Test
{
    class TestThread
    {
        private static void FirstThreadFun()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);
            }
            Console.WriteLine(Thread.CurrentThread.Name + "的优先级:" + Thread.CurrentThread.Priority);
            Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
        }

        private static void SecondThreadFun()
        {
            for (int j = 0; j < 10; j++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   j =  " + j);
            }
            Console.WriteLine(Thread.CurrentThread.Name + "的优先级:" + Thread.CurrentThread.Priority);
            Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
        }

        static void Main(string[] args)
        {
            //程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].
            Thread.CurrentThread.Name = "MainThread";
                        
            Thread secondThread = new Thread(new ThreadStart(TestThread.SecondThreadFun));
            //取名为 secondThread
            secondThread.Name = "secondThread";
            //设定线程的优先级为AboveNormal[在所有创建的新线程中,执行顺序为第二]
            secondThread.Priority = ThreadPriority.AboveNormal;

            //创建第一个线程
            Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
            //取名为 firstThread
            firstThread.Name = "firstThread";
            //设定线程的优先级为最高级[在所有创建的新线程中,最先执行.线程优先级默认为Normal,共5 级:Highest,AboveNormal,Normal,BelowNormal,Lowest]
            firstThread.Priority = ThreadPriority.Highest;

            for (int z = 0; z < 20; z++)
            {
                if (z == 10)

                {

         //这里与上一节的代码略有不同

                    secondThread.Start();

                    firstThread.Start();
                    firstThread.Join();

                    secondThread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
                }
            }
            Console.Read();
        }
    }

}

运行结果:

图1                                                  图2                                                 图3

  

总结:

1.上面三个图的运行结果都不一样,但有一点是相同的.主线程是最先执行的[不管新创建的线程级别如何]

2.当满足新线程启动条件后,secondThread总是先执行,是因为secondThread线程先启动了[尽管firstThread优先级高于secondThread] .

3.当secondThread运行了一小段时间后,firstThread线程接着执行.

4.当两个新创建的线程都执行完毕后,主线程继续执行.

注:

1.多线程同时工作的时候,优先级高的线程要先启动[Thread.Start()],先加入[Thread.Join()].

2.这个例子里因为启动顺序搞错了,也可以看出多线程,并不是说所有的线程同时工作,而是轮流运行的.

Thread.ThreadState 属性

这个属性代表了线程运行时状态,在不同的情况下有不同的值,我们有时候可以通过对该值的判断来设计程序流程。
ThreadState 属性的取值如下:
Aborted:线程已停止;
AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止;
Background:线程在后台执行,与属性Thread.IsBackground有关;
Running:线程正在正常运行;
Stopped:线程已经被停止;
StopRequested:线程正在被要求停止;
Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行);
SuspendRequested:线程正在要求被挂起,但是未来得及响应;
Unstarted:未调用Thread.Start()开始线程的运行;
WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态;

上面提到了Background状态表示该线程在后台运 行,那么后台运行的线程有什么特别的地方呢?其实后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止 后,CLR(通用语言运行环境)将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。

 

原文地址:https://www.cnblogs.com/bruce1992/p/14660997.html