C#多线程——Thread睡眠、中断、合并、暂停与恢复、终止

一、睡眠

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(),现在实现线程的暂停与灰度可以通过AutoResetEventManualResetEvent这两个阻塞事件类来实现。

两种事件的不同

  • 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.<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值