这个程序会让你深刻的体会时间片,线程的优先级!!!建议多测试这个程序,一定要看下面的注。
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 ,如需转载请自行联系原作者