天天看点

一个多线程程序

这个程序会让你深刻的体会时间片,线程的优先级!!!建议多测试这个程序,一定要看下面的注。

using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace 一个多线程程序

{

    class ThreadApp

    {

        static int interval;

        //static long interval; //你可以换成long测试过10亿单位级的数字

        static void DisplayNumbers()

        {   

            //获取当前运行线程的Thread对象实例

            Thread thisThread = Thread.CurrentThread;

            Console.WriteLine("线程: " + thisThread.Name + " 已开始运行.");

            //循环计数直到结束,在指定的间隔输出当前计数值

            for (int i = 1; i <= 8 * interval; i++)

            {

                if (i % interval == 0)

                {

                    Console.WriteLine(thisThread.Name + ": 当前计数为 " + i);

                }

            }

            Console.WriteLine("线程 " + thisThread.Name + " 完成.");

        }

        static void Main(string[] args)

        {            

            Console.Write("请输入一个数字:");

            interval = long.Parse(Console.ReadLine());//获取用户输入的数字

            //定义当前主线程线程对象的名字

            thisThread.Name = "Main Thread";

            //建立新线程对象

            ThreadStart workerStart = new ThreadStart(DisplayNumbers);

            Thread workerThread = new Thread(workerStart);

            workerThread.Name = "Worker Thread"; //设置线程名字

            //如果输入的数字相对比较大(不一定很大),同时包裹下面这条语句,那么workerThread线程早完成的概率就大

            //workerThread.Priority = ThreadPriority.AboveNormal;

            workerThread.IsBackground = true; //把workerThread线程设置为后台线程。这个属性似乎不影响线程进入自己时间片的时间

            workerThread.Start(); //启动新线程

            DisplayNumbers(); //主线程同步进行计数 即为了Main()方法这个主线程计数

            Console.WriteLine("UESTC_Terry");//和下面等价,几乎和下面的那条语句同时执行

            ThreadApp.MyMethod();//和上面等价,几乎和上面的那条语句同时执行

            Console.ReadLine();

        private static void MyMethod()

        {

            Console.WriteLine("UESTC_Terry");

    }

}

/*

   注:Main()方法总是应用程序的第一个线程,因为第一个线程是由.net的运行库开始执行的。

       所以程序一启动就相当于启动了Main()线程,从而不需要显示的调用Start()方法。而后续的

       线程由应用程序在内部启动,即应用程序可以选择启动哪个线程。所以必须要调用Start()方法

       来启动相应的线程。

*/   

   注:由于Windows是一个抢先式多任务处理的操作系统。所以Windows会在某个进程中选择一个线程,该线程运行完它的

       一个时间片后,Windows就会收回控制权,选择下一个被分配时间片的线程。这些时间片非常短(估计不超过几毫秒)

       所以造成上面这个程序会因输入数字大小的不同,执行结果大有不同。这正体现了时间片这个思想。

*/

   注:建议一定多测试这个程序,多换些数字来测试,从小到大,int类型不行,就long类型,测试多了,就会对时间片有

       更加深刻的理解。

本文转自terryli51CTO博客,原文链接:http://blog.51cto.com/terryli/520661 ,如需转载请自行联系原作者

继续阅读