程序,而且.NET 的编译语言有自动的垃圾收集功能,这个垃圾收集发生在另外一个线程里
面,所有的这些都是后台发生的,让我们无法感觉到发生了什么事情.在这里默认的是只有一
个线程来完成所有的程序任务,但是正如我们在第一篇文章讨论过的一样,有可能我们根
据需要自己添加更多的线程让程序更好的协调工作。比如说我们的例子中,一个有用户输
入的同时需要绘制图形或者完成大量的运算的程序,我们必须得增加一个线程,让用户的
输入能够得到及时的响应,因为输入对时间和响应的要求是紧迫的,而另外一个线程负责
图形绘制或者大量的运算。
.NET 基础类库的 System.Threading 命名空间提供了大量的类和接口支持多线程。这个命名
空间有很多的类,我们将在这里着重讨论 Thread 这个类。
System.Threading.Thread 类是创建并控制线程,设置其优先级并获取其状态最为常用的类。
他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍:
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于 Wait 或者 Sleep 或者 Join 线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort ( ) : 以 开 始 终 止 此 线 程 的 过 程 。 如 果 线 程 已 经 在 终 止 , 则 不 能 通 过
Thread.Start()来启动线程。
通过调用 Thread.Sleep,Thread.Suspend 或者 Thread.Join 可以暂停/阻塞线程。调用 Sleep()
和 Suspend() 方法意味着线程将不再得到 CPU 时间。这两种暂停线程的方法是有区别的,
Sleep()使得线程立即停止执行,但是在调用 Suspend()方法之前,公共语言运行时必须到达
一个安全点。一个线程不能对另外一个线程调用 Sleep()方法,但是可以调用 Suspend()方法
使得另外一个线程暂停执行。对已经挂起的线程调用 Thread.Resume()方法会使其继续执
行。不管使用多少次 Suspend()方法来阻塞一个线程,只需一次调用 Resume ()方法就可以
使 得 线 程 继 续 执 行 。 已 经 终 止 的 和 还 没 有 开 始 执 行 的 线 程 都 不 能 使 用 挂 起 。
Thread.Sleep ( int x ) 使 线 程 阻 塞 x 毫 秒 。 只 有 当 该 线 程 是 被 其 他 的 线 程 通 过 调 用
Thread.Interrupt()或者 Thread.Abort()方法,才能被唤醒。如果对处于阻塞状态的线程
调用 Thread.Interrupt()方法将使线程状态改变,但是会抛出 ThreadInterupptedException
异常,你可以捕获这个异常并且做出处理,也可以忽略这个异常而让运行时终止线程。在
一定的等待时间之内,Thread.Interrupt()和 Thread.Abort()都可以立即唤醒一个线程。
下面我们将说明如何从一个线程中止另外一个线程。在这种情况下,我们可以通过使用
Thread.Abort()方法来永久销毁一个线程,而且将抛出 ThreadAbortException 异常。使终