资讯专栏INFORMATION COLUMN

Java中线程的5种状态

neuSnail / 1917人阅读

摘要:线程的状态参考资料参考虚拟机一书的内容,进行总结。一线程的种状态新建使用创建一个线程之后。启动一个线程,该线程会进入等待队列等待的执行,因此可以细分为和状态。结束当线程的方法执行结束后,该线程就结束了。

线程的状态
参考资料:https://www.cnblogs.com/happy...

参考JVM虚拟机一书的内容,进行总结。

关于线程的理解,我们将一个线程看成是一个任务task,这样应该更好理解。

每一个线程就是一个任务,我们要执行一个任务,这个任务如果完成了,那么我们的程序功能就得到了实现。

因为只有一个CPU,也就是说只有一个干活的人。那么我们开始了那么多的任务,CPU就需要频繁地切换任务来执行,这样我们就能更好地理解任务的一些状态了。

无限等待

对于无线等待的任务,第一种情况。

假设有任务A和任务B,我们在任务B的执行代码中:A.join(); ,这表示把任务B放在任务A的后面执行,那么任务B只有等待任务A做完之后才可以继续执行(准确地说是进入运行状态)。也就是说我们无法确定任务B等待的时间,这取决于任务A,所以这叫做无限等待。

对于无限等待的任务,第二种情况。

假设有任务C和任务D,我们在任务C的执行代码中:Object.wait() ,这表示把任务C搁置,让它无限等待下去。任务C什么时候可以继续执行呢?只有当其他任务调用了notify()notifyAll() 方法之后,这表示CPU将去看看那些无限等待的任务(特指使用了wait() 方法而等待的任务),然后把它们唤醒(这些任务又进入了运行状态)。这种情况下,我们无法确定任务C等待的时间,这取决于notify()notifyAll() 方法的通知,这就是无限等待的第二种情况。

一、线程的5种状态

新建(New) :使用new Thread() 创建一个线程之后。

运行(Runnable) :使用Thread.start() 方法之后。启动一个线程,该线程会进入等待队列等待CPU的执行,因此可以细分为runnable和running状态。

无限等待(waiting) :处于这种状态的线程,不会被分配CPU执行时间,需要等待其他线程显式地唤醒,然后进入运行状态。

调用Thread.join() 方法。将会一直等待上一个线程的执行结束,然后被上一个线程唤醒。

调用Object.wait() 方法。将会一直等待,直到其他线程中使用了notify()、notifyAll()进行唤醒。

有限等待(timed waiting) :处于这种状态的线程,不会被分配CPU执行时间,既可以被其他线程显式地唤醒,也可以在一定时间后由系统自动唤醒,然后进入运行状态。

调用Thread.sleep(timeout) 方法。该方法不会释放持有的对象锁。

调用Object.wait(timeout) 方法。该方法会释放持有的锁。

调用Thread.join(timeout) 方法。

阻塞(blocked) :阻塞和等待的区别在于,阻塞是在等待获取一个排它锁,因为该线程获取不到锁所以被阻塞住而不能允许;而等待则是等待一段时间或者是等待被唤醒,等待状态并不是等待获取锁。这个状态有个特点,一个线程请求锁,得到之后该线程进入阻塞状态;而其他线程再来请求锁,由于得不到而阻塞;当该锁释放后,被阻塞的线程得到锁就进入了运行状态。

synchronized 修饰的代码块、方法。使得线程之间有并行变成串行执行。

IO操作,也是串行执行。

结束(terminated) :当线程的run() 方法执行结束后,该线程就结束了。

图示:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71692.html

相关文章

  • [Java并发-7]java线程小节

    摘要:在领域,实现并发程序的主要手段就是多线程。可运行状态指的是线程可以分配执行。当等待的事件出现了,线程就会从休眠状态转换到可运行状态。导出线程栈,分析线程状态是诊断并发问题的一个重要工具。 在 Java 领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如 Java、C# 等都对其进行了封装,但原理和思路都是相同都。Java 语言里的线程本质上就是...

    Sunxb 评论0 收藏0
  • java并发编程学习1--基础知识

    摘要:死亡状态线程退出有可能是正常执行完成也有可能遇见异常退出。类有新建与死亡状态返回其余状态返回判断线程是否存活。线程因某些原因进入阻塞状态。执行同步代码块的过程中执行了当前线程放弃开始睡眠进入就绪状态但是不会释放锁。 【java内存模型简介 JVM中存在一个主存区(Main Memory或Java Heap Memory),Java中所有变量都是存在主存中的,对于所有线程进行共享,而每个...

    huangjinnan 评论0 收藏0
  • 慕课网_《细说多线程之Thread VS Runnable》学习总结

    摘要:时间年月日星期六说明本文部分内容均来自慕课网。慕课网教学源码无学习源码第一章课前准备前言课程说明比较和这两种线程创建的方式,需要知道和的基本创建方式。一旦主线程获取到了用户的输入,这时候,阻塞就会解除掉,主线程继续运行,直到结束。 时间:2017年07月08日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://g...

    netScorpion 评论0 收藏0
  • Java线程生命周期

    摘要:线程的生命周期线程的生命周期大致可以分为下面五种状态新建状态就绪状态运行状态休眠状态终止状态新建状态,是线程被创建且未启动的状态这里的创建,仅仅是在的这种编程语言层面被创建,而在操作系统层面,真正的线程还没有被创建。 概要 目前CPU的运算速度已经达到了百亿次每秒,甚至更高的量级,家用电脑即使维持操作系统正常运行的进程也会有数十个,线程更是数以百计。 线程是CPU的调度和分派的基本单位...

    ivyzhang 评论0 收藏0
  • 详细分析Java断机制

    摘要:没有提供一种安全直接的方法来停止某个线程,但是提供了中断机制。中断的原理中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。线程的中断状态由该方法清除。测试线程是否已经中断。 1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务...

    bergwhite 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<