本篇文章给大家谈谈java中线程的状态包括,以及java线程状态有几种对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享java中线程的状态包括的知识,其中也会对java线程状态有几种进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java多线程有哪些状态?
初始态:一个线程调用了new方法之后,并在调用start方法之前的所处状态。
就绪:一旦线程调用了start 方法,线程就转到Runnable 状态。
阻塞/ NonRunnable:线程处于阻塞/NonRunnable状态,这是由两种可能性造成的:要么是因挂起而暂停的,要么是由于某些原因而阻塞的,例如包括等待IO请求的完成。
停止/退出:线程转到退出状态,这有两种可能性,要么是run方法执行结束,要么是调用了stop方法。
线程的六种状态
线程整个生命周期分为六种状态: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状态。
Java中线程的几种可用状态有哪些?请大家解释一下。
线程在执行过程中,可以处于下面几种状态:
1、就绪(Runnable):线程准备运行,不一定立马就能开始执行。
2、运行中(Running):进程正在执行线程的代码。
3、等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
4、睡眠中(Sleeping):线程被强制睡眠。
5、I/O阻塞(BlockedonI/O):等待I/O操作完成。
6、同步阻塞(BlockedonSynchronization):等待获取锁。
7、死亡(Dead):线程完成了执行。
谈谈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中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。
用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。
线程的生命周期,把图转化为文字就是:
1、线程通过new方法创建,调用start,线程进入就绪状态,等待系统的调度(时间片轮转调度)。当系统调度,进入运行状态。正常结束或者异常退出,进程进入死亡状态。
2、处于运行状态的线程若遇到sleep,则线程进入睡眠状态,不会让出资源锁,sleep结束,线程转为就绪状态,等待系统重新调度。
3、处于运行状态的线程可能在等待io,也可能进入挂起状态。io完成,转为就绪状态。
4、处于运行状态的线程yield,线程转为就绪状态。(yield只让给权限比自己高的)
5、处于运行状态的线程遇到wait,线程处于等待状态,需要notify()/notifyALL来唤醒线程,唤醒后的线程处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。处于运行的线程synchronized,加上后 变成同步操作。处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。
(二)线程状态、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中线程的状态包括和java线程状态有几种的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
java中线程的状态包括的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java线程状态有几种、java中线程的状态包括的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~