博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中线程的5种状态
阅读量:6830 次
发布时间:2019-06-26

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

线程的状态

参考资料:

参考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() 方法执行结束后,该线程就结束了。

图示:

线程状态

转载地址:http://pvnkl.baihongyu.com/

你可能感兴趣的文章
echart3 文档参数不全,如何查看全面的参数
查看>>
【新产品】.NET条形码控件 Spire.Barcode for .NET发布
查看>>
Github上推出的区块链项目92%濒临死亡
查看>>
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
查看>>
存储过程
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
如何成为一个Xamarin专家
查看>>
如何禁止root用户远程登录
查看>>
eigrp在数据中心应用案例
查看>>
NetCore MVC 静态文件生成
查看>>
文件系统的简单介绍及路径概念详解、FHS及文件类型区分
查看>>
ubuntu 12.04 san存储配置
查看>>
angularjs分页
查看>>
Linux 切分文件名或文件扩展名
查看>>
Linux 添加启动项 rc.local
查看>>
npoi设置Excel边框
查看>>
Java提高篇(二六)-----hashCode
查看>>
如何用zabbix创建自定义监控项
查看>>
PHP json_encode Unicode 解决办法
查看>>