目前我们使用的电脑都是多核处理器,讨论并行执行才有意义,之前的单核是的并行任务实际是操作系统的分时实现。
> 创建线程
使用Thread类
Thread th = new Thread(PrintNumber); //创建一个独立线程
th.Start(); //开始执行线程
PrintNumber();
创建线程委托的方法
static void PrintNumber()
{
Console.WriteLine("Starting......");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(10);
}
}
输出:
主线程和创建的线程同时执行了打印任务,可以看出任务在并行执行。
> 暂停线程
Thread.Sleep()方法 使线程处于休眠状态,它会占尽可以能的CPU时间。
static void PrintNumberWithDelay()
{
Console.WriteLine("Starting with delay.....");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromMilliseconds(200));
}
}
创建新线程执行:
Thread th = new Thread(PrintNumberWithDelay);
th.Start();
PrintNumber();
输出:
新线程每打印一个数字会休眠0.2秒,所以主线程中代码会比独立线程中的方法先执行。
> 线程等待
让程序等待一个线程中的计算完成,然后在代码中使用该线程的计算结果。线程调用 join() 方法
private static int sum { get; set; }
static void checkSum()
{
for (int i = 0; i <= 100; i++)
{
sum += i;
Thread.Sleep(10);
}
}
Thread th = new Thread(checkSum);
th.Start();
th.Join();//等待线程的完成
Console.WriteLine(sum);
输出:
线程等待是处在阻塞状态的。
> 线程终止
调用Abort方法
Thread t1 = new Thread(PrintNumberWithDelay);
t1.Start();
Thread.Sleep(1000);
t1.Abort();//终止线程
Console.WriteLine("t1 thread has been aborts!");
Thread t2 = new Thread(PrintNumber);
t2.Start();
PrintNumber();
输出:
不推荐使用Abort方法来终止线程,该技术不一定总能终止线程,该方法实际是给线程注入ThreadAbortException方法,导致线程被终止,这非常危险,因为该异常可以在任何时刻发送,并有可能彻底摧毁应用程序。建议使用 CancellationToken方法来取消执行的线程。
> 线程状态检测
属性ThreadState
static void DoNothing()
{
Thread.Sleep(2000);
}
static void PrintNumbersWithstatus()
{
Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());
for (int i = 0; i < 10; i++)
{
Thread.Sleep(2000);
Console.WriteLine(i);
}
}
Console.WriteLine("Main Thread starting...");
Thread t1 = new Thread(PrintNumbersWithstatus);
Thread t2 = new Thread(DoNothing);
Console.WriteLine(t1.ThreadState.ToString());
t2.Start();
t1.Start();
for (int i = 0; i < 30; i++)
{
Console.WriteLine(t1.ThreadState.ToString());
}
Thread.Sleep(TimeSpan.FromSeconds(6));
t1.Abort();
Console.WriteLine("t1 aborted");
Console.WriteLine(t1.ThreadState.ToString());
Console.WriteLine(t2.ThreadState.ToString());
输出: