線程是程式中的控制流程程的封裝。你可能已經習慣於寫單線程程式,也就是,程式在它們的代碼中一次只在一條路中執行。如果你多弄幾個線程的話,代碼運行可能會更加“同步”。在一個有著多線程的典型進程中,零個或更多線程在同時運行。但是,在有著N個CPU的機器上,一個線程只能在給定的時間上在一個CPU上運行,因為每個線程都是一個程式碼片段,每個CPU一次只能運行一段代碼。而看起來像是N 個同時完成是線程間共用CPU時間片的效果。這個例子裡,我們將建立另一個線程,我們將用兩個線程示範多線程的工作方式,最後,我們實現兩個線程(主線程與新線程)同步,在新線程工作前必須等待訊息。建立線程前我們必須引入System.Threading命名空間。然後我需要知道的是,線程得為控制流程程建立一個起點。起點是一個函數,可以使一個相同的調用或其它。
這裡你可以看到在同一個類中定義的起點函數。
Code
using System;
using System.Threading;
namespace ThreadingTester
{
class ThreadClass
{
public static void trmain()
{
for ( int x = 0 ;x < 10 ;x ++ )
{
Thread.Sleep( 1000 );
Console.WriteLine(x);
}
}
static void Main( string [] args)
{
Thread thrd1 = new Thread( new ThreadStart(trmain));
thrd1.Start();
for ( int x = 0 ;x < 10 ;x ++ )
{
Thread.Sleep( 900 );
Console.WriteLine( " Main : " + x);
}
}
}
}
Thread.Sleep(n)方法把“this”線程置於n毫秒的休眠狀態。你可以看看這個例子,在主函數我們定義了一個新的線程,其中它的起點是函數trmain(),我們然後包含了Start()方法開始執行。如果你運行這個例子,你就會瞭解線程間的切換(讓CPU從運行一個線程轉到另一個線程)讓線程幾乎同時運行,為了能看哪個線程運行更快我把主線程設定比新線程少100毫秒。
現在,在開始線程前,先給線程命名:
Thread thrd1=new Thread(new ThreadStart(trmain));
thrd1.Name="thread1";
thrd1.Start();
Thread tr = Thread.CurrentThread;
Console.WriteLine(tr.Name);
在完成上面程式後,設想我們不想在一開始新線程就讓它馬上運行結束,也就是說,我們開啟了一個新線程,讓它運行,在某個特定的時間點,新線程暫停並等待從主線程(或其他線程)發來的訊息。
我們可以這樣定義:
public static ManualResetEvent mre = new ManualResetEvent(false);
ManualResetEvent建立時是把false作為start的初始狀態,這個類用於通知另一個線程,讓它等待一個或多個線程。注意,為了通知或監聽同一個線程,所有的其它線程都能訪問那個類。
等待線程這樣寫:
mre.WaitOne();
這將引起等待線程無限期的阻塞並等待類來通知。
發訊號的線程應該這樣:
mre.Set();
這樣類就會被通知,值變成true,等待線程就會停止等待。在通知事件發生後,我們就可以使用下面語句把線程置於基狀態:
mre.Reset();
現在讓我們在程式執行一下:
Code
using System;
using System.Threading;
namespace ThreadingTester
{
class ThreadClass
{
public static ManualResetEvent mre = new ManualResetEvent( false );
public static void trmain()
{
Thread tr = Thread.CurrentThread;
Console.WriteLine( " thread: waiting for an event " );
mre.WaitOne();
Console.WriteLine( " thread: got an event " );
for ( int x = 0 ;x < 10 ;x ++ )
{
Thread.Sleep( 1000 );
Console.WriteLine(tr.Name + " : " + x);
}
}
static void Main( string [] args)
{
Thread thrd1 = new Thread( new ThreadStart(trmain));
thrd1.Name = " thread1 " ;
thrd1.Start();
for ( int x = 0 ;x < 10 ;x ++ )
{
Thread.Sleep( 900 );
Console.WriteLine( " Main: " + x);
if ( 5 == x) mre.Set();
}
while (thrd1.IsAlive)
{
Thread.Sleep( 1000 );
Console.WriteLine( " Main: waiting for thread to stop " );
}
}
}
}