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


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 方法释放了锁


线程三态和JVM线程状态的更多相关文章

  1. JVM线程状态,park, wait, sleep, interrupt, yeild 对比

    ---恢复内容开始--- JVM线程状态 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED BLOCKED是等待获得对象锁 WAIT ...

  2. JVM线程状态Running、Sleeping、Wait、Park、Monitor

    1,使用JVisualVM时,打开Threads监控,我们可以发现Java的线程状态有以下几种: 2,JVM线程状态: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_W ...

  3. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  4. JAVA基础知识之多线程——线程的生命周期(状态)

    线程有五个状态,分别是新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead). 新建和就绪 程序使用new会新建一个线程,new出的对象跟普通对象一 ...

  5. Java多线程——线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  6. JVM线程安全

    一.线程的调度方式 线程调度分为两种方式: 协同式调度和抢占式调度.协同式调度:线程的执行时间由线程本身控制,线程将工作执行完之后,通知操作系统切换到其他线程上.缺点:时间不可控,就算出问题,也不会通 ...

  7. 深入理解JVM - 线程安全与锁优化 - 第十三章

    线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对 ...

  8. 牛客网Java刷题知识点之线程的几种可用状态(新建、可运行、运行、阻塞、死亡)

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=13 ...

  9. 廖雪峰Java11多线程编程-1线程的概念-3线程的状态

    1线程的状态 线程终止的的原因: run()或call()方法执行完成,线程正常结束 线程抛出一个未捕获的Exception或Error 直接调用该线程的stop()方法来结束该线程--该方法容易导致 ...

随机推荐

  1. Harbor 忘记密码

    Harbor密码重置 01,登入到harbor容器里面的数据库上 docker exec -it harbor-db /bin/bash 02,登入数据库 psql -h postgresql -d ...

  2. SpringBoot的ApplicationRunner

    Article1 在开发中可能会有这样的情景.需要在容器启动的时候执行一些内容.比如读取配置文件,数据库连接之类的.SpringBoot给我们提供了两个接口来帮助我们实现这种需求.这两个接口分别为Co ...

  3. 【排错】springboot项目,启动报An attempt was made to call the method com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; but it does not exist.

    pom文件新引入:     <dependency>         <groupId>com.google.code.gson</groupId>         ...

  4. IDEA Rider 准备试用一段时间(1)

    IDEA Rider是一个C#开发工具,目前最高版本支持C# 8.0语法. IDEA Rider2019.2月版本相比之前2018版本多了新功能,又支持Edit and Continue,所以准备试用 ...

  5. WebSocket的简单认识&SpringBoot整合websocket

    1. 什么是WebSocket?菜鸟对websocket的解释如下 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务 ...

  6. 【CTS2019】氪金手游(动态规划)

    [CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...

  7. 【Luogu5348】密码解锁(莫比乌斯反演,数论)

    [Luogu5348]密码解锁(莫比乌斯反演,数论) 题面 洛谷 题解 首先题目给定的限制是\(\sum_{n|i}a[i]=\mu(n)\),然后把这个东西反演一下, 莫比乌斯反演的式子是:\(g( ...

  8. DNS:从零搭建公司内网DNS服务器

    写在前面的话 网上关于 DNS 的文章其实一搜索一大把,但是看别人的文档一般都会有个问题,乱,不讲究,全是 ctrl c + ctrl v,我个人是看不下去的.头皮发麻.所以决定自己来写写这方面的东西 ...

  9. How to call a stored procedure in EF Core 3.0 via FromSqlRaw(转载)

    问: I recently migrated from EF Core 2.2 to EF Core 3.0. Unfortunately, I haven't found a way to call ...

  10. layui提示框事件

    使用layui提示框的时候遇到个问题,点击“确定”“取消”之类的按钮会执行里面的方法,但点击×就不会执行,所以在添加数据的时候出现个BUG,就是保存数据后点击弹出提示框的×,继续保存,如此循环,就可以 ...