C#线程Thread
目录
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
例子如下
鲸落于海,星沉于洼,风隐于密林,蝉鸣漏进夏至,想让世间所有温柔住进你眼里