最近在看disruptor源码,在获取ringbuffer的下一个序列的时候,disruptor有几种等待策略,其中有YieldingWaitStrategy类,是使用java的Thread.yield();方法作为等待的方式,了解了一下
Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态
那么线程的这几种状态是什么呢,今天系统总结一下
我们翻开thread类的源码可以看到有一个State的枚举类型
其中有以下几种分别代表:
NEW 线程尚未启动的线程状态。
RUNNABLE 可运行状态,一个线程在jvm中已经运行但是这个线程在等待系统的资源,不是锁也不是sleep
BLOCKED 线程处于一个阻塞的状态,一般是同步块或方法被调用后,等待锁资源的释放
WAITING 等待线程,一般是线程调用了,wait,join,LockSupport#park,线程进入这个状态,一般是在等待另一个线程执行特定操作,比如一个线程执行wait那么就是在等待另一个线程执行notify或者notifyAll,如果是join那么就是在等待另一个线程终止
TIMED_WAITING 线程进入等待状态等待一个时间流逝,比如线程调用Thread.sleep,Object.wait(带有超时时间限制),LockSupport.parkNanos,LockSupport.parkUntil
TERMINATED 线程终止
这里有一张图:参考:http://blog.csdn.net/pange1991/article/details/53860651
而我们的yield是暂停当前正在执行的线程对象,并执行其他线程。
这个就是为什么,我们打断点在yield执行之后,线程有的时候并不会暂停,而是继续执行
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
下面代码有一段说明