多线程编程

来源:互联网 发布:公司取名软件crsky 编辑:程序博客网 时间:2024/06/06 18:56

1.Thread类主要的线程属性和线程方法。

线程类的属性:

ApartmentState:这个属性指示线程是运行在单线程单元(STA)中,或者多线程单元(MTA)中。

CurrentThread:静态只读属性,返回当前活动的线程,或运行中的线程。

IsAlive:如果线程没有终止或退出,该属性返回真,否则返回假。

IsBackground:如果该线程是一个后台线程,该属性返回真,否则返回假。

IsThreadPoolThread:如果线程是托管线程池的成员,该属性返回真,否则返回假。

Name:获取或设置线程的名称。这是一个单次写入的字段。

Priority:设置线程的优先级。是一个ThreadPriority枚举值。

ThreadState:获取线程的状态。

注:后台线程与前台线程几乎是一样的,惟一的区别在于:活动前台线程能够使进程无法被关闭,而后台线程则不能。当进程将要终止时,进程会等待所有的前台线程先终止,然后终止所有的后台线程。

 

ThreadState属性具有一个Flags属性,其中可以包含多个值。只要进行按位比较,就可以得到字段中的指定值。

ThreadState的值有:

Aborted:线程已经退出,当前处于停止状态。

AbortRequested:已经对线程发出退出请求,但请求尚未处理。

Background:线程已经标记为后台线程。

Running:线程处于启动状态。

Stoped:线程已停止。

StopRequested:仅限内部使用。已经对线程发出停止请求。

Suspended:线程已挂起。

SuspendRequested:已经对线程发出挂起请求。

Unstarted:线程尚未启动,因此处理器没有收到安排线程执行的请求。

WaitSleepJoin:由于调用Wait、Sleep或Join方法,导致线程阻塞。

 

线程类的重要方法:

Abort:这个方法会引发ThreadAbortException异常,使得线程终止。(虽然可以捕捉到该异常,并进行记录或执行其他函数,但这样并不会抑制异常。因为系统会在每次捕捉的最后重新引发异常。只有使用Thread.ResetAbort方法才会取消这种异常)。

Interrupt:使WaitSleepJoin状态的线程中断,否则Interrupt方法等待线程进入该状态,然后再中断线程。

Join:阻塞所调用的线程,直到线程终止为止。对ThreadState.Unstarted状态下的线程不能使用该方法。

ResetAbort:这个方法能够取消当前线程中未决的Thread.Abort命令。

Resume:使挂起的线程继续执行。

Sleep:使线程阻塞一定时间。如果参数为0,则线程将挂起,先让其他线程进行处理。如果值为Infinite,线程将无限时挂起。

SpinWait:使线程等待若干个周期时间,然后继续执行。

Start:使线程进入ThreadState.Running状态,并由处理器安排线程的执行。如果线程已经终止,该方法无法重新启动线程。

Suspend:使线程挂起,不继续执行。如果线程已经挂起,则该方法无效。

VolatileRead:此方法能够读取某个字段的最新值,并且忽略所使用的处理器数量。该方法只能影响单次内存访问。

VolatileWrite:此方法会立即向字段写入一个值,并且保证数据不被缓存,使该数据对所有处理器都可见。

 

2.ThreadStart委托:对于线程需要执行的程序代码而言,ThreadStart委托就是一个包装程序,可以在创建Thread对象的实例时,将ThreadStart委托作为参数传递。创建方法为:

ThreadStart workerThreadStart=newThreadStart(SimpleWorkerThreadMethod);

 

创建线程有两种方法:

1)     创建线程类的新实例,并传入ThreadStart委托。Thread t=newThread(workerThreadStart)

2)     使用线程类的静态属性CurrentThread。Thread t=Thread.CurrentThread。

 

运行线程:调用Thread对象实例的Start()方法。workerThread.Start()。

终止线程两种方法

1)     针对由ThreadStart委托包装的方法,方法执行完后线程立即自动结束。

2)     当线程接收到ThreadAbortException异常时会自动终止线程。如调用封装了死循环的线程方法,如果原来是从一个单独的线程中调用该方法,那么只要调用Thread.Abort方法,就会引发ThreadAbortException异常,并由此中断循环并终止线程。(注:此异常在catch中不能进行消除,如果确实需要消除此异常,需在捕捉到此异常后调用Thread.AbortReset方法)。

挂起线程:表示处理器不再需要安排这个线程的执行,该线程开始等待外界的唤醒。挂起方法:workThread.Suspend();需要线程继续进行的方法:workThread.Resume(); 。

线程休眠:将线程的执行阻塞一段指定时间,同时线程处于WaitSleepJoin状态。使用workThread.Sleep()方法。参数为毫秒数,如果传递Infinite关键字,则线程将会无限时阻塞。

联接线程:调用workThread.Join()方法将使调用线程进入WaitSleepJoin状态,然后调用线程将阻塞,直到另一个线程实例终止。如果另一个线程始终没有终止,那么调用线程也会一直阻塞下去。

 

3.不同类型的同步

同步类型

说明

对应的.NET类

Mutex

使用mutex同步,避免多个线程在同一时刻访问同一共享资源

Mutex

Critical Section

临界区同步的作用与mutex是一样的,但临界区同步不能跨进程

lock、Monitor、Interlocked、RederWriterLock

Semaphore

信号灯同步限制了访问同一共享资源的线程数量

Event

事件同步能够通知其他线程执行指定操作

AutoResetEvent、ManualResetEvent、WaitHandle

 

4.用事件同步线程的方法是:当前线程在准备好继续进行处理后,就通知其他线程。经常使用这种方案的情况是,一个线程需要等待其他线程先完成任务,然后才能继续处理。.NET中有两个类用来处理事件,分别为AutoResetEvent和ManalResetEvent。这两个类的作用几乎一样,惟一的区别在于前者等到线程释放后,会将事件的通知状态复位为未通知,而后者需要手动复位事件。

 

5.Mutex类、Monitor类等。//P160-P168

对非同步编程使用线程池:ThreadPool类。

WaitCallback委托:与ThreadStart类似,也是程序代码的一个包装,表示这段代码将由线程池执行,但该委托拥有一个参数。

将工作项排入队列:ThreadPool.QueueUserWorkItem(newWaitCallback(ThreadPoolThreadMethod));

线程冲突:程序在运行线程池任务之前直接退出,称为线程冲突(race condition)。

原创粉丝点击