线程开发
NET通过System.Threading命名空间下的类来抽象线程。其中最重要的就是类Thread,Thread类抽象了线程,它的一个对象就代表了一个线程。
当创建了一个 Thread对象时,这个线程并没有开始执行,而是处于非执行的状态,当调用了 Thread对象的 Start()方法就表明线程可以开始执行了,但是线程并不一定马上就执行了。多线程程序的一个最大的特征就是不确定性,在很多时候只能预测大概的执行时间和顺序,但是实际的执行时机只有操作系统才会知道。当Start()了的Thread对象在被系统告知可以执行了后,就等待操作系统开始执行这个线程所包含的执行序列。如果没有特殊情况发生,它将会执行到时间片用完或者代码在时间片用完前就执行完了。这个时候线程就会转移到非执行状态或者转到结束状态,从而等待被销毁。如果在执行的过程中遇到特殊情况,可以随时将线程转为非执行的状态或者直接结束。这个过程可以是主动的也可以是被动的。如果是主动的话,线程只有在执行的状态下才能将自己的状态转移到非执行或者结束。如果是被动的话,只有在非执行的时候可以被被正在执行的线程把状态转为可执行或者被结束掉。
------------------------------------- 下面是Thread类常用的属性
--------------------------------------------------下面是Thread类常用的方法
--------------------------创建和启动线程
在使用任何线程类之前,必须定义
System.
Threading名称空间。定义方法如下:
using System.Threading;
创建线程实例的方法是:
Thread myThread = new Thread(方法名);
启动线程的方法是:
myThread.Start();
--------------------------线程睡眠
在执行线程的时候需要让正在执行的线程暂停下来,将CPU资源交给其它的线程,这个时候我们可以将线程睡眠。方法是:
Thread.Sleep();
Sleep()是
Thread类的静态方法,它可以让执行到这一句的线程睡眠,我们可以通过参数设置具体睡眠时间,单位是毫秒,比如:
Thread.Sleep(1000);
但是并不是说1000毫秒后这个线程就又开始执行了,而是>=1000毫秒。因为1000毫秒后这个线程只是具备了可以执行的能力,但是还是必须在队列里等待OS去调用它。还必须注意的是,正在执行的线程才可以睡眠,其他状态下的线程是不可能主动睡眠的,因为那些线程本来就不活动不用睡眠了。
--------------------------线程合并
Thread类的
Join()方法能够将两个交替执行的线程合并为顺序执行的线程。
比如在线程A中调用了线程B的 Join()方法(例如:B.Join();),线程B将插入线程A之前,直到线程B执行完毕后,才会继续执行线程A。但是如果B一直不结束,那么A也无法继续执行。为了解决这个问题,可以在调用B的Join方法的时候指定一个睡眠时间,这样一来,A线程就不会一直等下去了。例如:
比如在线程A中调用了线程B的 Join()方法(例如:B.Join();),线程B将插入线程A之前,直到线程B执行完毕后,才会继续执行线程A。但是如果B一直不结束,那么A也无法继续执行。为了解决这个问题,可以在调用B的Join方法的时候指定一个睡眠时间,这样一来,A线程就不会一直等下去了。例如:
B.Join(100);
-------------------------线程阻塞与唤醒
Thread对象的
Suspend()方法,这个方法会一直阻塞线程,直到在其他线程对这个线程的对象执行
Resume()方法。
一个线程可以自己调用 Suspend()把自己阻塞,也可以将非活动线程阻塞。但是恢复一个线程的话只能通过当前正在活动的线程调用正被阻塞的线程对象的 Resume()方法才行。
一个线程可以自己调用 Suspend()把自己阻塞,也可以将非活动线程阻塞。但是恢复一个线程的话只能通过当前正在活动的线程调用正被阻塞的线程对象的 Resume()方法才行。
-----------------------线程终止
终止线程方法是:
myThread. Abort();
Thread类的
Abort方法用于永久地杀死一个线程。但是请注意,在调用
Abort方法前一定要判断线程是否还激活,也就是判断
thread.
IsAlive的值:
if (myThread.IsAlive )
{
myThread.Abort();
}