一、睡眠
Sleep(int millisecondsTimeout)
Thread.Sleep(int millisecondsTimeout)
还有一个重载Thread.Sleep(TimeSpan timeout)
,作用是将当前线程挂起一定的时长,期间放弃CPU使用权,时间到了自动恢复线程和其他线程一起参与CPU的竞争。
//调用——Thread类的静态方法
Thread.Sleep(1000);//将当前所在进程挂起1000ms
Timespan ts=new Timespan(1,20,33);//创建一个时间间隔对象,长度为1h22min33s
Thread.Sleep(ts);//将当前线程挂起1h22min33s
SpinWait(int iterations)
Thread.SpinWait(int iterations)
也是Thread类的静态方法,将当前线程等待一定长的时间(ms为单位),期间占用时间片,不放弃CPU的使用权,类似于让CPU执行一段无效代码。
//调用
Thread.SpinWait(1000);//将当前线程等待1000ms,等待结束后可以立即执行不需要重新参与CPU竞争
二、中断Interrupt
Interrupt方法只可以中断处于 WaitSleepJoin 状态的线程,抛出异常并改变该线程的状态,线程将恢复执行。
如果一个线程处于阻塞状态(如调用了Sleep()、Join()等阻塞方法以及可中断通道的I/O操作后的阻塞),则在线程状态为WaitSleepJoin状态时,就会在阻塞方法调用处抛出ThreadInterruptException异常,并且在抛出异常后将线程状态设置为其他状态,从而线程从阻塞状态醒过来,并在结束线程前让程序员有足够的时间来处理中断请求。
//调用
thread.Interupt();
三、合并Join
thread.Join()表示thread线程终止之前阻止调用其他线程,thread终止之后自动恢复原来的线程,通常在其他线程或者主线程中使用此方法,起到临时强制优先执行特定线程的效果。
//调用
thread.Join();//可以有参数,表示合并的时长
四、暂停与恢复
C#已经弃用了不安全的Suspend()和Resume(),现在实现线程的暂停与灰度可以通过AutoResetEvent
和ManualResetEvent
这两个阻塞事件类来实现。
两种事件的不同
- AutoResetEvent是自动阻塞,同时只允许一个线程通过一次,然后继续阻塞,类似于小区门口测体温
- ManualResetEvent是手动阻塞,打开后需要手动阻塞,否则会一直打开;阻塞后需要手动打开,否则会一直阻塞,类似于水龙头
Set()、Reset()与WaitOne()
- WaitOne()阻塞线程,等待信号;有带参数的重载,设置等待时间以及等待超时的操作
- Set()方法可以发出可通过信号
- Reset()方法可以发出不可通过信号
使用
- AutoResetEvent
public class
{
//实例化AutoResetEvent对象,参数bool表示are初始的状态,true表示通过
private static AutoResetEvent are = new AutoResetEvent(true);
Thread th=new Thread(new ThreadStart(ThTest));
private static ThTest()
{
are.WaitOne();
Console.WriteLine(1);
are.<