這個程式會讓你深刻的體會時間片,線程的優先級!!!建議多測試這個程式,一定要看下面的注。
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 ,如需轉載請自行聯系原作者