博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程三态和JVM线程状态
阅读量:4958 次
发布时间:2019-06-12

本文共 1497 字,大约阅读时间需要 4 分钟。


1、线程三态:就绪态运行态阻塞态

img


2、JVM中的六种状态

  • NEW(新建状态):一个尚未启动的线程所处的状态。

  • RUNNABLE(可运行状态):可运行线程的线程状态,可能正在运行,也可能在等待处理器资源。

  • BLOCKED(锁阻塞):被阻塞等待监视器锁定的线程所处的状态。

    使用:当一个线程试图获取锁,但锁此时被其他线程持有,该线程进入BLOCKED状态,当线程拿到锁则进入RUNNABLE状态。

  • WAITING(无限等待,阻塞):未指定等待时间的线程所处的状态。

    使用:调用Object.join()、Object.wait()方法时进入此状态,一个线程处于该状态时,只能被另一个线程唤 醒,而不能自己主动唤醒,另一个线程调用notify()或notifyAll()来唤醒该线程。

  • TIMED_WAITING(定时等待。阻塞):指定等待时间的线程所处的状态。

    使用:Thread.sleep(long)、Object.join(long)或Object.wait(long)方法时进入此状态,直到时间超时或收到唤醒通知。

    • 注意:wait(0)时是可以自己苏醒的,比如当Thread结束时就会自动苏醒。
  • TERMINATED(终止状态):已经执行完成的线程状态。


3、join和wait、sleep

  • join作用:Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。join()方法必须在线程start(0方法调用之后调用才有意义。

  • join原理:就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。

    • join的底层实现就是基于wait的。

    • wait是线程间通信常用的信号量,作用就是让线程暂时停止运行,等待其他线程使用notify来唤醒或者达到一定条件自己苏醒。

    • wait是一个本地方法,属于Object类,其底层实现是JVM内部实现,是基于monitor对象监视锁。

    • join是Thread类的方法,不是底层本地方法。

    • join方法synchronized关键字修饰,是线程安全的。

    • join的三个重载方法主要还是基于join(long millis)方法,因此我们主要关注这个方法,方法的处理逻辑如下:

      1. 参数millis小于0,抛出IllegalArgumentException("timeout value is negative")异常    2. 参数millis等于0,判断调用join的线程(假设是A)是否存活,不存活就不执行操作,如果存活,就调用wait(0),阻塞join方法,等待A线程执行完在结束join方法。3. 参数millis大于0,判断调用join的A线程是否存活,不存活就不执行操作,如果存活,就调用wait(long millis),阻塞join方法,等待时间结束再继续执行join方法。
    • 由于join是synchronized修饰的同步方法,因此会出现join(long millis)阻塞时间超过了millis的值。

  • wait和sleep两者最主要的区别在于:sleep 方法没有释放锁,而 wait 方法释放了锁


转载于:https://www.cnblogs.com/aric2016/p/11496090.html

你可能感兴趣的文章
流操作的规律
查看>>
Python基础学习15--异常的分类与处理
查看>>
javascript运算符的优先级
查看>>
React + Redux 入门(一):抛开 React 学 Redux
查看>>
13位时间戳和时间格式化转换,工具类
查看>>
vue router-link子级返回父级页面
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
div 只显示两行超出部分隐藏
查看>>
C#小练习ⅲ
查看>>
电源防反接保护电路
查看>>
arraylist
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
2124: 等差子序列 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
客户数据库出现大量cache buffer chains latch
查看>>
機械の総合病院 [MISSION LEVEL: C]
查看>>