一个多线程程序

来源:互联网 发布:javascript decodeuri 编辑:程序博客网 时间:2024/05/16 07:46

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

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类型,测试多了,就会对时间片有
       更加深刻的理解。
*/
原创粉丝点击