启动多线程是构建一个充分利用资源的应用程序的好方式,但在时计适应多线程时你很快就会发现事实上通过函数启动一个线程是不够的,往往我们需要更多的操作来对线程进行管理比如挂起、恢复和终止线程。使用线程时,如何避免资源冲突是关键的操作,这时需要锁定资源,是他只能同时被一个线程使用。
1.启动线程和关闭线程
1 static void Main(String [] args) 2 { 3 Thread DoWorkThread =new Thread(new ThreadStart(DoWork)); 4 DoWorkThread.Start(); 5 Thread.Sleep(1000); 6 DoWorkThread.Abort(); 7 8 Console.WriteLine("The Main () thread is ending"); 9 10 THread.Sleep();11 }12 public static void DoWork()13 {14 Console.WriteLine("DoWork is running on another thread!");15 try16 {17 Thread.Sleep(5000);18 }19 catch(ThreadAbortException ex)20 {21 Console.WriteLine("DoWork was aborted!");22 }23 finally24 {25 Console.WriteLine("Use finally to close all open resources.");26 }27 Console.WriteLine("DoWork has ended");28 29 }
该程序输出如下所示:
DoWork is running on another thread.
DoWork was aborted.
User finally to close all open resources.
The Main() is thread is ended.
事实上DoWork方法并没有输出"DoWork has ended"这是因为DoWork还在执行Sleep时就被终止了,如果你注释掉Abort方法的话任务将会顺利的完成执行。
2.进程的挂起和继续
我们可以尝试调用Thread.Suspend和Thread.Resume来挂起和继续线程的执行。然而,这些方法并不是很好。因为这两个方法不依赖于受控线程的协作,也就是说他们的线程安全性将不被保证。他们具有高度的入侵行为,能够导致一些严重的应用程序问题,比如死锁。一个挂起的线程拥有的资源却正是一个正在进行的线程所需要的。与之相反应该使用Monitor来进行线程的挂起和继续,这个我将会在接下来的博文中提到。
3.线程的优先级
在线程创建了但是还没有启动的时候,我们可以使用ThreadPriority的枚举来设置线程的Thread.Priority属性控制线程的优先级。线程的优先级告诉操作系统哪个线程更加的重要,使系统分配给各个线程合理的性能资源。
通常高优先级的线程会先于低优先级的线程完成。优先级从最高到最低的可用选项如下:
Highest
AboveNormal
Normal
BelowNormal
Lowest