温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java线程的生命周期状态有哪些

发布时间:2021-12-31 09:19:14 来源:亿速云 阅读:348 作者:iii 栏目:大数据

这篇文章主要讲解了“Java线程的生命周期状态有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程的生命周期状态有哪些”吧!

在 Java 中线程的生命周期中一共有 6 种状态。

  • New(新创建)

  • Runnable(可运行)

  • Blocked(被阻塞)

  • Waiting(等待)

  • Timed Waiting(计时等待)

  • Terminated(被终止)

如果想要确定线程当前的状态,可以通过 getState() 方法,并且线程在任何时刻只可能处于 1 种状态。

一:线程的六种状态

1.1:New 新建

Java线程的生命周期状态有哪些

New 表示线程被创建但尚未启动的状态:当我们用 new Thread() 新建一个线程时,如果线程没有开始运行 start() 方法,那么此时它的状态就是 New

1.2:Runable 可运行

Java线程的生命周期状态有哪些

一旦线程调用了 start(),它的状态就会从 New 变成 Runnable。

1.3:阻塞状态

Java 中阻塞状态通常不仅仅是 Blocked,实际上它包括三种状态,分别是 Blocked(被阻塞)、Waiting(等待)、Timed Waiting(计时等待),这三 种状态统称为阻塞状态

1.3.1:Blocked 被阻塞

Java线程的生命周期状态有哪些

从 Runnable 状态进入 Blocked 状态只有一种可能,就是进入 synchronized 保护的代码时没有抢到 monitor 锁。当处于 Blocked 的线程抢到 monitor 锁,就会从 Blocked 状态回到Runnable 状态

1.3.2:waiting 等待

Java线程的生命周期状态有哪些

  1. 让线程从Runable 进入 Waiting 状态有三种方法:

  • 没有设置 Timeout 参数的 Object.wait() 方法

  • 没有设置 Timeout 参数的 Thread.join() 方法

  • LockSupport.park() 方法

前面的Blocked(被阻塞状态) 仅仅针对 synchronized monitor 锁,可是在 Java 中还有很多其他的锁,比如 ReentrantLock,如果线程在获取这种锁时没有抢到该锁就会进入 Waiting 状态,因为本质上它执行了 LockSupport.park() 方法,所以会进入 Waiting 状态。

  1. 让线程从 Waiting 状态进入 Runable状态的情况:

Waiting 是不限时的,也就是说无论过了多长时间它都不会主动恢复。只有当执行了 LockSupport.unpark(),或者 join 的线程运行结束,或者被中断时才可以进入 Runnable 状态

  1. 让线程从 Waiting 状态进入 Blocked状态的情况:

当其他线程调用 notify() 或 notifyAll()来唤醒它,它会直接进入 Blocked 状态。因为唤醒 Waiting 线程的线程如果调用 notify() 或 notifyAll(),要求必须首先持有该 monitor 锁,所以处于 Waiting 状态的线程被唤醒时拿不到该锁,就会进入 Blocked 状态,直到执行了 notify()/notifyAll() 的唤醒它的线程执行完毕并释放 monitor 锁,才可能轮到它去抢夺这把锁,如果它能抢到,就会从 Blocked 状态回到 Runnable 状态。如下图所示:

Java线程的生命周期状态有哪些

1.3.3:Timed Waiting 计时等待

Java线程的生命周期状态有哪些

在 Waiting 上面是 Timed Waiting 状态,这两个状态是非常相似的,区别仅在于有没有时间限制,Timed Waiting 会等待超时,由系统自动唤醒,或者在超时前被唤醒信号唤醒。

  1. 让线程进入 Timed Waiting 状态有下面几种情况:

  • 设置了时间参数的 Thread.sleep(long millis) 方法

  • 设置了时间参数的 Thread.join(long millis) 方法

  • 设置了时间参数的 Object.wait(long timeout) 方法

  • 设置了时间参数的 LockSupport.parkNanos(long nanos) 方法和 LockSupport.parkUntil(long deadline) 方法

  1. 让线程从 Timed Waiting 状态进入 Runable状态的情况:

如果它的超时时间到了且(能直接获取到锁或join的线程运行结束、被中断或调用了LockSupport.unpark() ),会直接恢复到 Runnable 状态,而无需经历 Blocked 状态

  1. 让线程从 Timed Waiting 状态进入 Blocked状态的情况:

同waiting状态一样,Timed Waiting 中执行 notify() 和 notifyAll() 也是一样的道理,它们会先进入 Blocked 状态,然后抢夺锁成功后,再回到 Runnable 状态。

1.4:Terminated 终止

Java线程的生命周期状态有哪些

Terminated 终止状态,要想进入这个状态有两种可能。

  • run() 方法执行完毕,线程正常退出。

  • 出现一个没有捕获的异常,终止了 run() 方法,最终导致意外终止

1.5 小节

  1. 线程的状态是需要按照箭头方向来走的,比如线程从 New 状态是不可以直接进入 Blocked 状态的,它需要先经历 Runnable 状态。

  2. 线程生命周期不可逆:一旦进入 Runnable 状态就不能回到 New 状态;一旦被终止就不可能再有任何状态的变化。所以一个线程只能有一次 New 和 Terminated 状态,只有处于中间状态才可以相互转换。

二:java线程状态与操作系统线程状态的对应

2.1 操作系统中的线程状态

Java线程的生命周期状态有哪些

2.2 Java的Runable状态对应操作系统中的什么状态?

Java 中的 Runable 状态对应操作系统线程状态中的两种状态,分别是 Running 和 Ready,因为Java 中处于 Runnable 状态的线程有可能正在执行,也有可能没有正在执行,正在等待被分配 CPU 资源。

所以,如果一个正在运行的线程是 Runnable 状态,当它运行到任务的一半时,执行该线程的 CPU 被调度去做其他事情,导致该线程暂时不运行,它的状态依然不变,还是 Runnable,因为它有可能随时被调度回来继续执行任务

2.2 Java的Waiting/Timed Waiting/Blocked状态对应操作系统中的什么状态?

无论是Timed Waiting ,Waiting还是Blocked,对应的都是操作系统线程的Waiting(等待)状态。

感谢各位的阅读,以上就是“Java线程的生命周期状态有哪些”的内容了,经过本文的学习后,相信大家对Java线程的生命周期状态有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI