C#线程Thread

配套源码地址 :https://gitee.com/qianzidada/ThreadTest

Start 方法

分出一个线程来去执行所调用的方法,而主线程的方法继续,代码如下

Join方法

主线程会等待分线程,分线程执行完了,才会执行主线程

1.简单点的

2.难一点的

下面是调试过程

线程1和线程2同时进行,经过判断之后,线程1会等待线程2执行完毕后在执行

3.线程超时

如果线程等待时间为0 例如 Thread(0) 那么,这个线程就会放弃时间片,将CPU的占用交给其他线程

3.1 没有超时

3.2 超时状态

3.3 TimeSpan的超时

Sleep方法

暂停当前线程,等待XX时间,可以是毫秒也可以是TimeSpan

线程阻塞

如果线程的执行由于某种原因暂停了,那么这个线程就认为被阻塞了 ,例如使用Sleep Join,
被阻塞的线程会立即将处理器的时间片交给其他线程,从此该线程就不消耗CPU的时间了,直到该线程不满足阻塞条件才会再次执行。

解除阻塞

  • 阻塞条件不满足了
  • 操作超时
  • 通过Thread.Interrupt()进行打断
  • 通过Thread.Abort()进行中止

线程安全

本地状态

共享状态

安全问题

第一个线程走到 if(!_done)时看到是Flase输出Done等待0.1秒,恰巧这个时候线程2也走到这了_done还是为False也输出Done

如何解决上述问题? 加

向线程中传递数据

或者

线程的优先级

线程的优先级(Thread 的Priority属性)决定了相对于操作系统中其它活跃线程所占的执行时间。.

优先级分为:

 enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }

信号

有时,你需要让某线程一直处于等待的状态,直至接收到其它线程发来的通知。这就叫做signaling (发送信号)。
最简单的信号结构就是ManualResetEvent

例子如下

posted @ 2020-07-14 15:19  乾子  阅读(424)  评论(0编辑  收藏  举报