1、using System.Threading;
thread1.Start(); 开始线程
thread1.Name ="" 线程名只能赋值一次
Thread.CurrentThread.Name 当前线程名
thread1.Join() 参数可以为毫秒也可以为TimeSpan,运行thread1线程,当有参数时如果超时返回False
Thread.Sleep() 参数可以为毫秒也可以为TimeSpan,Thread.Sleep(0)这样调用会导致线程立即放弃本身当前的时间片,自动将cpu移交给其他线程。
Thread.Yield() 做同样的事,但是它只会把执行交给同一处理器上的其他线程
2、阻塞(Blocking)
当等待Sleep或Join,线程处于阻塞状态;
thread1.ThreadState 当前线程状态
可以通过ThreadState这个属性来判断线程是否处于阻塞的状态
bool blocked = (someThread.ThreadState & ThreadState.WaitSleepJoin) != 0;
ThreadState最有用的四个枚举值是:
Unstarted,Running,WaitSleepJoin,Stopped
/*如果是ThreadState.Unstart | ThreadState.WaitSleppJoin |ThreadState.Stopped 则返回这些状态
否则就是Running状态*/
public static ThreadState SimpleThreadState (ThreadState ts) { return ts & (ThreadState.Unstart | ThreadState.WaitSleppJoin | ThreadState.Stopped); }
3、解除阻塞
当满足下面四种情况时,就会解除阻塞
1、阻塞条件被满足
2、操作超时(如果设置超时的话)
3、通过Thread.Interrupt()进行打断
4、通过Thread.Abort()进行中止;
4、阻塞和忙等待(自旋) Blocking vs Spinning
IO-bound操作的工作方式有两种:
在当前线程上同步的等待:Console.ReadLine() ,Thread.Sleep(), Thread.Join()...
异步的操作,在稍后操作完成时触发一个回调动作。
同步等待的I/O-bound操作将大部分时间花在阻塞线程上。
他们也可以周期性的在一个循环里进行“打转(自旋)”
while(DateTime.Now < nextStartTime)
Thread.Sleep(100);
while (DateTime.Now < nextStartTime);