.Net组件程序设计之线程、并发管理(一)安全
如今几乎全部的应用程序都是多线程的,给用户看来就是一个应用程序界面(应用程序线程),无论什么操做都不会致使界面出现响应慢的状况,这些都是多线程的功劳,有了多线程,可让应用程序尽最大可能的处理更多的操做,调动不少线程来并行处理请求,这样会使得应用程序有更大的系统吞吐量。多线程
1.1线程并发
线程是什么呢?线程就是进程中的一条执行路径,每一个应用程序至少在一个线程上运行。在本篇中将会对线程稍做讲解.编辑器
在.NET中,线程是执行的基本单元。在.NET中的线程并不是是操做系统中的物理线程,而是对物理线程的托管代码表示。函数
在.NET System.Threading命名空间下,有个Thread类型的类,它就是表明着托管线程。测试
1.2线程的建立spa
咱们直接来看下线程建立的示例:操作系统
1 public class ThreadingMethodCase 2 { 3 public static void ThreadingMethod() 4 { 5 Thread thread = Thread.CurrentThread; 6 int threadid = thread.ManagedThreadId; 7 Console.WriteLine(thread.Name + "ThreadID is " + threadid); 8 } 9 }
1 ThreadStart threadstart = new ThreadStart(ThreadingMethodCase.ThreadingMethod); 2 Thread thread = new Thread(threadstart); 3 thread.Name = "SubThread"; 4 thread.Start();
在.NET中建立一个线程首先须要线程方法,什么叫线程方法?首先线程是一个操做或是一组操做的表示,线程方法就是前面这句话中的【操做】。
这里先看一下Thread类型的构造函数接受了一个ThreadStart类型的无参数委托,这个是好理解的。
线程建立了必需要显示的调用它的Start()函数才能开始执行线程。调用Strat()函数是不会对当前线程形成阻塞的,就是说在调用了以后控制权会马上的回到当前的线程的客户端中。线程
1 public sealed class Thread 2 { 3 public void Suspend(); 4 public void Resume(); 5 …… 6 }
Suspend()方法是挂起线程的执行.设计
Resume()方法则是释放挂起的线程,让线程继续执行在调用Suspend()方法的时候,是不会形成当前线程阻塞的,在调用后,控制权当即返回的,并且在要被挂起的线程中, 也不是被当即挂起的,而是在执行到一个安全点的时候,才会执行挂机操做的。什么是安全点?举个例子吧,假如要被挂起的线程中 正在执行一个函数的时候,外部被通知命令,要被挂起,这个时候线程是不会被挂起的,当这个函数执行完毕的时候,线程则会被挂起, 假设编辑器是把安全点插设在每一个函数的末端的。
.NET中是不推荐咱们使用这两个函数的,由于会形成不少方面的不稳定。
1.3.2线程睡眠
1 public sealed class Thread 2 { 3 public static void Sleep(int millisecondsTimeout); 4 public static void Sleep(TimeSpan timeout); 5 …… 6 }
Sleep()是静态函数,是一个阻塞调用而且使当前线程放弃CPU时间片,就是在休眠指定的时间后,控制权才会返回到调用的线程。
Thread.Sleep(20);//让当前调用线程休眠20毫秒
Thread类还提供了另外一种相似于休眠的操做:
1 public static void SpinWait(int iterations);
调用SpinWait()也是会形成当前阻塞的,可是当前线程不会放弃CPU时间片,而是在等待有限的时间(参数设置)后继续执行, 这种函数是在可控的状况下才去这样调用的,好比说当前线程要使用一个资源,而这个资源在被其余线程使用,那么就可使用 SpinWait()函数,在等待有限的时间后,再去读取资源,若是资源还没被其余线程释放,当前线程也会继续执行,全部这是用于可控的状况下的方法。
1.3.3 加入线程
Thread类的Join()方法可让一个线程等待另外一个线程的终结。
这句定义什么意思呢?说是说不清的,来看一下Thread.Join()示例代码 :
1 public class StudyCase 2 { 3 public void ThreadingTest() 4 { 5 ThreadStart threadstart = new ThreadStart(ThreadingMethodCase.ThreadingMethod); 6 Thread thread = new Thread(threadstart); 7 thread.Name = "newThread"; 8 Thread.CurrentThread.Name = "CurrentThread"; 9 for (int i = 0; i < 5; i++) 10 { 11 if (i == 0) 12 { 13 thread.Start(); 14 thread.Join(); 15 } 16 Console.WriteLine(Thread.CurrentThread.Name+"_"+i.ToString()); 17 } 18 } 19 20 }
1 public class ThreadingMethodCase 2 { 3 public static void ThreadingMethod() 4 { 5 Thread thread = Thread.CurrentThread; 6 int threadid = thread.ManagedThreadId; 7 Console.WriteLine(thread.Name + "ThreadID is " + threadid); 8 } 9 }
从上图的结果再结合代码看一下,就大概的清楚了Join的意思了,意义就是阻塞当前线程,等待子线程(ThreadingTest函数中的thread变量)执行完毕时,当前线程再执行。
1.3.4线程停止
调用Thread类型提供的Abort()方法能够停止线程的运行,而且被停止的线程会抛出一个ThreadAbortException类型的异常。下面的示例代码会清晰的描述和示例代码结果图。
来看示例代码:
1 public class ThreadingMethodCase 2 { 3 public static void ThreadingMethodDiv() 4 { 5 try 6 { 7 while (true) 8 { 9 Console.WriteLine("测试子线程停止"); 10 } 11 } 12 catch (ThreadAbortException abex) 13 { 14 Console.WriteLine(Thread.CurrentThread.Name+"-子线程内部-" + abex.Message); 15 } 16 } 17 } 18 public class StudyCase 19 { 20 public void ThreadingTestAbort() 21 { 22 Thread.CurrentThread.Name="CurrentThread"; 23 ThreadStart threadstart = new ThreadStart(ThreadingMethodCase.ThreadingMethod); 24 Thread thread = new Thread(threadstart); 25 thread.Name = "newThread"; 26 27 thread.Start(); 28 for (int i = 0; i < 10; i++) 29 { 30 Console.WriteLine(i.ToString()); 31 } 32 thread.Abort(); 33 thread.Join(); 34 35 Console.WriteLine("当前线程"); 36 } 37 38 }
将在下一章讲解线程同步。
做者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面