1.终止线程
当一个线程执行很长时间也没有结束,有时候需要手动取消,释放资源。可以使用终止线程。使用Thread的示例方法Abort(),不过此方法已经被微软标记为废弃。以下代码仅演示终止的效果。一般不建议使用此方法。因为终止可能随时,引发一些异常
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(PrintNum);
t.Name = "ThreadT";
t.Start();
Thread.Sleep(TimeSpan.FromMilliseconds(1100));
t.Abort();
Console.WriteLine("Main thread", Thread.CurrentThread.Name);
}
static void PrintNum()
{
Console.WriteLine("Thread t starting...");
Thread.Sleep(TimeSpan.FromSeconds(1));
for(int i=1;i<10;i++)
{
Console.WriteLine("{0},{1}",Thread.CurrentThread.Name,i);
Thread.Sleep(TimeSpan.FromMilliseconds(50));
}
}
}
开始子线程运行,过了一会,主线程终止线程。运行效果如下:
可以发现,程序提示了当前平台不支持异常,主线程抛出异常。
2.线程状态
线程状态定义在枚举ThreadState里面,定义枚举开始时是Unstarted,启动以后是Running。如果线程进入等待,状态可能是WaitSleepJoin。在程序中,可以根据这些状态进行一些操作;
3.线程优先级
线程优先级定义在枚举ThreadPriority中,操作系统有优先执行标记为Highest线程,有剩余资源才会执行优先级比较低的线程
4.前台线程和后台线程
前面线程默认都是前台线程,当指定IsBackground=true时候,是后台线程。前台线程和后台线程的区别就是。主线程需要等待所有前台线程都执行完成以后。再结束结束程序,如果存在后台线程没结束,主线程忽略它,直接结束程序。
举一个不太恰当的例子说明前台线程和后台线程。假设人(前台线程)和机器人(后台线程)去执行一个维修工作。因为发生毒气泄漏必须马上要撤离当前地点。那么只要人(前台线程)都撤离了,就可以关闭了。机器人是否已经撤离不需要关心。