java线程有哪些状态(java线程几种状态)

网友投稿 203 2023-02-04


本篇文章给大家谈谈java线程有哪些状态,以及java线程几种状态对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享java线程有哪些状态的知识,其中也会对java线程几种状态进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

线程的六种状态

线程整个生命周期分为六种状态:NEW状态、RUNNABLE状态、BLOCKED状态、WAITING状态、TIMED_WAITING状态、TERMINATED状态。其中NEW状态、RUNNABLE状态与TERMINATED状态是每个线程必定经历的状态。下面我大致讲解一下每个状态的具体效果。

        NEW状态:尚未启动的线程处于此状态。

        RUNNABLE状态:在Java虚拟机中执行的线程处于此状态。

        BLOCKED状态:被阻塞等待监视器锁定的线程处于此状态。

        WAITING状态:无限期等待另一个线程执行特定操作的线程处于此状态。

        TIMED_WAITING状态:正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。

        TERMINATED状态:已退出的线程处于此状态。

        流程创建后未启动会进入NEW状态,启动后进入RUNNABLE状态,执行线程任务,结束线程释放,进入TERMIBATED状态。而在RUNNABLE状态时可能会出现由于时间片到期,程序从内部暂停等情况进入阻塞(BLOCKED状态、WAITING状态和TIME_WAITING状态大都可以理解为阻塞),而当达到一定的条件,如程序对线程的唤醒,或争抢到时间片时,线程从阻塞进入RUNNABLE状态。

(二)线程状态、wait/notify

在java中线程一共有6种状态。分别为:

sleep不会释放锁(CPU时间片),在存在锁的情况下,线程会一直占有锁,其他线程无法获取。

wait会释放锁,允许其他线程进入同步方法。在调用notify唤醒后会重新去获取锁。

sleep可以在任意地方使用,没有限制。
wait只能在同步方法中使用,依赖于锁。

问题:假如有一个生产者消费者需求:生产者线程对恭喜资源 Integer lock 每次执行加1,达到5以后唤醒消费者,消费者线程每次对Integer lock进行减1,到0时唤醒生产者。在这种情况下,Integer即作为共享资源,又作为锁的对象。那么这种情况会有什么问题呢?

答:问题是无法互相唤醒。
由于消费者是在lock = 0时执行 notify、wait操作,生产者是在lock = 5时执行 notidy、wait操作,因此两个lock其实不是同一个对象,无法执行唤醒。

Synchorized锁

wait/notify 是基于synchorized实现的,await/signal是基于Lock实现的(LookSupport),JUC中提供了Condition类await/signal来代替wait/notify,而Condition底层就是基于park/unpark做的线程通讯。不仅是Condition,AQS中也使用了park/unpark,可以理解为await/signal是park/unpark的外层封装。

wait/notify无法控制唤醒谁,随机唤醒(没有分组的概念)
await/signal可以,await/signal支持多个condition消费者一组,生产者一组,这样在多生产者消费者时可以确保唤醒的一定是分组内的。

答:没有锁的情况是不可以使用的。
可以试想,什么情况下才需要用到等待/唤醒场景呢?
以吃饭举例,到饭店吃饭,点完餐以后自己就进入等待状态(等着吃饭),需要等待服务员唤醒(餐好了通知),此类场景我们就需要用到等待、唤醒。
那么此时需要考虑,如果吃饭的人多了,那么我们怎么知道“餐好了”是谁的餐好了?服务员又怎么知道“餐好了我该叫哪位顾客”?现实场景中我们都是有座位号,或者取餐号,那么这个座位号、取餐号就是我们的锁,我获取到这把锁(其他顾客无法再获取),那么我与我点的餐之间就有了一个关联关系。服务员就可以通过这把锁来对我进行唤醒(1号的餐好了~)。

java线程的几种状态

总结了6种状态,希望对你所有帮助:

1、NEW 状态是指线程刚创建, 尚未启动

2、RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等

3、BLOCKED  这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchronized块里别人调用wait() 方法, 也就是这里是线程在等待进入临界区

4、WAITING  这个状态下是指线程拥有了某个锁之后, 调用了他的wait方法, 等待其他线程/锁拥有者调用 notify / notifyAll 一遍该线程可以继续下一步操作, 这里要区分 BLOCKED 和 WATING 的区别, 一个是在临界点外面等待进入, 一个是在临界点里面wait等待别人notify, 线程调用了join方法 join了另外的线程的时候, 也会进入WAITING状态, 等待被他join的线程执行结束

5、TIMED_WAITING  这个状态就是有限的(时间限制)的WAITING, 一般出现在调用wait(long), join(long)等情况下, 另外一个线程sleep后, 也会进入TIMED_WAITING状态

6、TERMINATED 这个状态下表示 该线程的run方法已经执行完毕了, 基本上就等于死亡了(当时如果线程被持久持有, 可能不会被回收)

谈谈OpenJDK中线程的9种状态

我在在查找了很多资料还有根据书籍,发现对于线程的状态,网上的说法各种各样的,这里就想做一个总结。

在jdk1.8 的源码当中,java中线程(Thread)的状态,注释里说的很清楚了,沿用的是1.5的,主要分为6种状态,每种状态之间都可以随着操作进行相互转换。后面会有OpenJDK的说法,一共是九种,别着急。

1.新建状态(New):

新创建了一个线程对象这个时候没有对他调用和执行。

2.运行中状态 RUNNABLE:

该状态可以被看成一 个复合状态。它包括两个子状态 :READY和RUNNING。前者表示处于该状态的线程可以被线程调度器(Scheduler)进行调度而使之处于RUNNING状态。后者表示处于该状态的线程正在运行,即相应线程对象的run方法所对应的指令正在由处理器执行。执行Thread.yield()的线程,其状态可能会由RUNNING转换为READY。处于READY子状态的线程也被称为活跃线程。

3.阻塞状态 BLOCKED:

一 个线程发起一个阻塞式 1/0 (Blocking I/0)操作后 12 , 或者申请一个由其他线程持有的独占资源(比如锁)时,相应的线程会处于该状态。处于BLOCKED状态的线程并不会占用处理器资源。当阻塞式I/0操作完成后,或者线程获得了其申请的资源,该线程的状态又可以转换为RUNNABLE。

一 个线程执行了某些特定方法之后就会处于这种等待其他线程执行另外一些特定操作的状态。能够使其执行线程变为WAITING状态的方法包括Object. wait()、 Thread.join()、LockSupport.park(Object)。能够使相应线程从WAITING变更为RUNNABLE的相应方法包括: Object.notify()/notify All()和LockSupport. unpark(Object))。

该状态和WAITING类似,差别在于处于该状态的线程并非尤限制地等待其他线程执行特定操作,而是处于带有时间限制的等待状态。当其他线程没有在指定时间内执行该线程所期望的特定操作时,该线程的状态自动转换为RUNNABLE。

6.终止状态 TERMINATED:

已经执行结束的线程处于该状态。由于一 个线程实例只能够被启动一 次,因此一 个线程也只可能有一次处于该状态。Thread.run()正常返回或者由于抛出异常而提前终止都会导致相应线程处于该状态。
附上源码
public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW,

以上是在JDK1.8中的Thread源码中备注的。

然而也有一种说法,在JVM中对状态的定义是九种,这里说的是在OpenJDK中的

2.运行 (RUNNABLE):笔者的理解就是,start之后线程进入到run方法,执行run方法的状态,也就是网上所说的准备(ready)和运行(running);

3.睡眠(SLEEPING):线程调用sleep(),之后抱锁等待的状态;

4.对象等待(IN_OBJECT_WAIT):也就是对象调用wait()方法之后的释放锁等待;

5.对象超时等待(IN_OBJECT_WAIT_TIMED):该状态不同于WAITING,它可以在指定的时间后自行返回

6.挂起(PARKED):该状态是线程没有拿到锁之后,进入等待队列之后一直处于挂起状态;

7.挂起超时(PARKED_TIMED):该状态不同于PARKED,它可以在指定的时间后自行解除挂起

8.阻塞监视(BLOCKED_ON_MONITOR_ENTER):进入同步之后的状态,也就是线程进入到同步块中,或者同步锁中的状态,读者也可以理解为线程进入独占模式下的状态;

9.终止(TERMINATED):表示该线程已经执行完毕; 关于java线程有哪些状态和java线程几种状态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 java线程有哪些状态的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java线程几种状态、java线程有哪些状态的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序使用form表单获取输入框数据的实例代码
下一篇:Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~