好記性不如爛筆頭,方便以后忘記了來(lái)這里看看,還有什么沒(méi)有提到的大家可以告訴我,幫忙完善,謝謝!~ Donate?[1]
準(zhǔn)備工作
創(chuàng)建一個(gè)控制臺(tái)程序

并在Program.cs文件中加入以下using指令:
using System;
using System.Threading;
using System.Console;
1.1.1 創(chuàng)建線程
先定義一個(gè)方法
static void Test()
{
Console.WriteLine("Starting...");
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i);
}
}
Main方法中加入以下代碼片段
Thread t = new Thread(Test);
t.Start();
這樣就完成了一個(gè)線程的創(chuàng)建.
1.1.2 暫停線程
只需要在線程調(diào)用的方法中調(diào)用Thread.Sleep方法就可以讓線程暫停
static void Test()
{
Console.WriteLine("Starting...");
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromSeconds(2)); //這樣就讓線程暫停了兩秒鐘
}
}
1.1.3 等待線程
只需要在線程開始后調(diào)用t.Join方法就可以讓主程序等待直到t線程完成
Thread t = new Thread(Test);
t.Start();
t.Join();
//如果不想一直等待,也可以給它加參數(shù)
//如: t.Join(TimeSpan.FromSeconds(2));等待兩秒后主線程繼續(xù)運(yùn)行
1.1.4 終止線程
只需要在需要終止線程的地方調(diào)用t.Abort就可以了,但這非常危險(xiǎn),因?yàn)閠.Abort方法是給t線程注入了ThreadAbortException方法,導(dǎo)致線程被終結(jié)的,該異常可以在任何時(shí)刻發(fā)生并可能徹底摧毀應(yīng)用程序.另外,使用該方法也不一定總能終止線程.目標(biāo)線程可以通過(guò)處理該異常并調(diào)用Thread.ResetAbort方法來(lái)拒絕終止.因此并不推薦使用Abort方法來(lái)關(guān)閉線程.可優(yōu)先使用一些其他方法,比如提供一個(gè)CancellationToken方法來(lái)取消線程的執(zhí)行.
Thread t = new Thread(Test);
t.Start();
Thread.Sleep(TimeSpan.FromSeconds(5));
t.Abort(); //線程開始5秒后終止線程
1.1.5 檢測(cè)線程狀態(tài)
可以用t.ThreadState方法來(lái)獲取線程當(dāng)前的狀態(tài),如是否已經(jīng)啟動(dòng)或是否處于阻塞等狀態(tài)信息.由于線程是獨(dú)立運(yùn)行的,其狀態(tài)可以在任何時(shí)候被改變,所以獲取線程的當(dāng)前狀態(tài)是非常有用的.
Thread t = new Thread(Test);
t.Start();
Console.WriteLine(t.ThreadState);
//打印t線程當(dāng)前的狀態(tài)
1.1.6 線程優(yōu)先級(jí)
可以使用t.Priority來(lái)設(shè)置線程的優(yōu)先級(jí),線程優(yōu)先級(jí)決定了該線程可占用多少CPU時(shí)間.
Thread t = new Thread(Test);
t.Priority = ThreadPriority.Highest;
t.Start();
1.1.7 前臺(tái)線程和后臺(tái)線程
用t.IsBackground設(shè)置線程為前臺(tái)線程和后臺(tái)線程.
1.前臺(tái)線程和后臺(tái)線程的主要區(qū)別:進(jìn)程會(huì)等待所有的前臺(tái)線程完成后再結(jié)束工作,但如果只剩下后臺(tái)線程,則會(huì)直接結(jié)束工作.
2.注意事項(xiàng):如果程序定義了一個(gè)不會(huì)完成的前臺(tái)線程,主程序并不會(huì)正常結(jié)束.
Thread t = new Thread(Test);
t.IsBackground = true;
t.Start();
1.1.8 向線程傳遞參數(shù)
使用t.Start傳遞數(shù)據(jù),為了應(yīng)用該方法,在線程中啟動(dòng)的方法必須接受object類型的單個(gè)參數(shù).
static void Test(object obj)
{
int count = (int) arg;
Console.WriteLine("Starting...");
for (int i = 1; i < count; i++)
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromSeconds(2));
}
}
Thread t = new Thread(Test);
t.Start(8);
使用lambda表達(dá)式傳遞參數(shù).
static void Test(int i)
{
Console.WriteLine(i);
}
Thread t = new Thread(()=> Test(1));
t.Start();
這可能會(huì)導(dǎo)致幾個(gè)問(wèn)題.例如在多個(gè)lambda表達(dá)式中使用相同的變量,他們會(huì)共享該變量值.例如下面這個(gè)例子,t1和t2都會(huì)打印出20,因?yàn)樵谶@兩個(gè)線程啟動(dòng)之前變量被修改為20.
int i = 10;
Thread t1 = new Thread(()=> Test(i));
i = 20;
Thread t2 = new Thread(()=> Test(i));
t1.Start();
t2.Start();
=>1.2線程基礎(chǔ)(二)
-
贊賞支持 ?