并发1关于线程的几种状态&关于yield的理解

Posted cutter_point

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发1关于线程的几种状态&关于yield的理解相关的知识,希望对你有一定的参考价值。

最近在看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()只能使同优先级或更高优先级的线程有执行的机会。

 

 下面代码有一段说明

 

以上是关于并发1关于线程的几种状态&关于yield的理解的主要内容,如果未能解决你的问题,请参考以下文章

关于条件变量与互斥锁信号量的区别,Linux下线程同步的几种方法

Java并发之线程

greenlet:轻量级的并发编程

关于创建及使用多线程的几种方法

JUC并发编程 -- 线程常用方法之sleep() & yield() & 线程优先级 & sleep方法应用: 限制对 CPU 的使用

多线程杂记