一个多线程程序

这个程序会让你深刻的体会时间片,线程的优先级!!!建议多测试这个程序,一定要看下面的注。
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());//获取用户输入的数字
            //定义当前主线程线程对象的名字
            Thread thisThread = Thread.CurrentThread;
            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类型,测试多了,就会对时间片有
       更加深刻的理解。
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值