本文目录一览:
- 1、谈谈OpenJDK中线程的9种状态
- 2、java线程运行怎么有第六种状态
- 3、Java中线程的几种可用状态有哪些?请大家解释一下。
- 4、JAVA中线程有哪五个基本状态?它们之间如何让转化?
- 5、JAVA中,线程有哪五个基本状态?他们之间如何让转化?并简述线程周期。
- 6、线程有几种状态?
谈谈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线程运行怎么有第六种状态
其实线程只有"就绪"、"阻塞"、"运行"三种状态:
1. 运行状态,线程正在干活的状态
2. 就绪状态,CPU正在忙活别的,线程摇晃着一个"恭候您光临"的小旗子的状态
3. 阻塞状态,线程主动让出CPU资源,摇晃着一个"我这会还不能出台您稍后再来"的小旗子的状态
"新建"和"终止"这两种状态其实并不是线程的状态,而是java.lang.Thread对象的状态。可以说,处于"新建"和"终止"状态的"线程"其实并不是线程,而只是一个代表着线程对象而已。
所以我们把"新建(NEW)"和"终止(TERMINATED)"两种状态去掉,那么Java定义的线程状态还有4种:
1. RUNNABLE
2. BLOCKED
3. WAITING
4. TIMED_WAITING
这四种状态怎么对应到"就绪"、"阻塞"、"运行"这三种状态里呢:
1. RUNNABLE,对应"就绪"和"运行"两种状态,也就是说处于就绪和运行状态的线程在java.lang.Thread中都表现为"RUNNABLE"
2. BLOCKED,对应"阻塞"状态,此线程需要获得某个锁才能继续执行,而这个锁目前被其他线程持有,所以进入了被动的等待状态,直到抢到了那个锁,才会再次进入"就绪"状态
3. WAITING,对应"阻塞"状态,代表此线程正处于无限期的主动等待中,直到有人唤醒它,它才会再次进入就绪状态
4. TIMED_WAITING,对应"阻塞"状态,代表此线程正处于有限期的主动等待中,要么有人唤醒它,要么等待够了一定时间之后,才会再次进入就绪状态
Java中线程的几种可用状态有哪些?请大家解释一下。
线程在执行过程中,可以处于下面几种状态:
1、就绪(Runnable):线程准备运行,不一定立马就能开始执行。
2、运行中(Running):进程正在执行线程的代码。
3、等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
4、睡眠中(Sleeping):线程被强制睡眠。
5、I/O阻塞(BlockedonI/O):等待I/O操作完成。
6、同步阻塞(BlockedonSynchronization):等待获取锁。
7、死亡(Dead):线程完成了执行。
JAVA中线程有哪五个基本状态?它们之间如何让转化?
java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。
用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。
新生---就绪:通过调用start()方法
就绪---运行:处于就绪状态的线程一旦得到CPU,就进入运行状态并自动调用自己的run()方法
运行---阻塞:处于运行状态的线程,执行sleep()方法,或等待I/O设备资源,让出CPU并暂时中止自己运行,进入阻塞状态
阻塞---就绪:睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪队列中等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。
运行---死亡:(1)(正常情况下)线程任务完成
(2)(非正常状况)线程被强制性的中止,如通过执行stop()或destroy()方法来终止一个线程
JAVA中,线程有哪五个基本状态?他们之间如何让转化?并简述线程周期。
java中,每个线程都需经历新生、就绪、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。
用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。
线程的生命周期,把图转化为文字就是:
1、线程通过new方法创建,调用start,线程进入就绪状态,等待系统的调度(时间片轮转调度)。当系统调度,进入运行状态。正常结束或者异常退出,进程进入死亡状态。
2、处于运行状态的线程若遇到sleep,则线程进入睡眠状态,不会让出资源锁,sleep结束,线程转为就绪状态,等待系统重新调度。
3、处于运行状态的线程可能在等待io,也可能进入挂起状态。io完成,转为就绪状态。
4、处于运行状态的线程yield,线程转为就绪状态。(yield只让给权限比自己高的)
5、处于运行状态的线程遇到wait,线程处于等待状态,需要notify()/notifyALL来唤醒线程,唤醒后的线程处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。处于运行的线程synchronized,加上后 变成同步操作。处于锁定状态,获取了“同步锁”,之后,线程才转为就绪状态。
线程有几种状态?
Java中的线程的生命周期大体可分为5种状态。
1、新建(NEW):新创建了一个线程对象。
2、可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。
3、运行(RUNNING):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
4、阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice转到运行(running)状态。
阻塞的情况分三种:
(一).等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二).同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三).其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5、死亡(DEAD):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。