zoukankan      html  css  js  c++  java
  • 【并发】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()只能使同优先级或更高优先级的线程有执行的机会。

     下面代码有一段说明

  • 相关阅读:
    一些技术鸡汤
    css优化
    Spring 通过maven pom文件配置初始化
    sql 编写横竖表转换
    Linux 常用命令笔记 (持续更新)
    java常用集合详解 contains
    jQuery Ajax(异步请求)
    java中"与"和"或"
    java8 中的时间和数据的变化
    mysql 根据查询结果集更新
  • 原文地址:https://www.cnblogs.com/cutter-point/p/8476614.html
Copyright © 2011-2022 走看看