线程状态有哪些

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。
在线程的生命周期中, 它要经过新建( New )、就绪( Runnable )、运行( Running )、阻塞
( Blocked )和死亡( Dead )5 种状态。尤其是当线程启动以后,它不可能一直"霸占"着 CPU 独自
运行, 所以 CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换


线程状态总结:

新建状态(new),也叫初始化状态,也就是new一个线程后,JVM为其分配内存,初始化变量

可运行状态(Runnable),也叫就绪状态,虚拟机创建栈和程序计数器,等待CPU时间片,等待调度

运行状态(Running),获得时间片,.run()方法运行,线程处于运行状态

堵塞状态(BLOCKED),某种原因放弃cpu使用权,让出cpu时间片,直到线程进入可运行状态。一般有三种阻塞情况,等待阻塞,执行.wait()方法,放入等待队列 。同步阻塞,线程获取对象同步锁时,同步锁被其他线程占用,JVM则放入锁池中,其他阻塞,调用IO,jion(),sleep()

结束状态(TERMINATED,terminated),表示线程执行结束。

起始还有两种:

等待状态(WAITING),需要等待其他线程做出一些特定动作,如通知或中断。调用wait()

超时等待(TIMEDWAITING),经过一定时间被唤醒。调用sleep()

备注:

  • .start()方法,会使线程从 “新建状态” 转变为 “就绪状态”。

线程会以下面三种方式结束,结束后就是死亡状态

1. 正常结束
run()或 call()方法执行完成,线程正常结束。
2. 异常结束
线程抛出一个未捕获的 Exception 或 Error。
3. 调用stop
直接调用该线程的 stop()方法来结束该线程— 该方法通常容易导致死锁 ,不推荐使用。

一个线程为什么不能两次调用start()

在java中,一个线程只能调用一个start()方法,第二次调用会抛出异常IllegalThreadStateException非法的线程状态异常。一个线程本身是具备一个完整的生命周期,(介绍Java的五种生命周期·)

当我们第一次调用start方法时,线程状态就可能处于终止或非new状态,再调用一次start方法,就相当于让该线程重新运行。不管从线程的安全性问题,还是线程本身的执行逻辑,都是不合理的。

因此,为了避免这个问题,每次线程运行时都会去判断当前线程的状态。

Java线程状态有六种,分别是: 1. 新建状态(New):当一个线程对象被创建时,它处于新建状态,此时它还没有开始运行。 2. 运行状态(Runnable):当调用start()方法后,线程对象开始运行,处于可运行状态。此时,线程可能正在执行,也可能正在等待系统分配资源。 3. 阻塞状态(Blocked):一个运行中的线程在某些情况下可能会进入阻塞状态。例如,线程调用了sleep()方法、IO操作、等待某个对象的锁、等待进入同步块等。 4. 等待状态(Waiting):当一个线程调用了wait()方法后,它就会进入等待状态,等待被唤醒或中断,可以通过notify()或notifyAll()方法唤醒。 5. 计时等待状态(Timed Waiting):某些情况下,线程需要等待一段时间再继续执行,调用sleep()或join()方法就会使线程进入计时等待状态。 6. 结束状态(Terminated):线程的任务执行完毕或者发生了异常,线程进入结束状态。 每种状态的原因如下: 1. 新建状态(New):线程刚被建立,还没有开始执行。 2. 运行状态(Runnable):线程被启动,正在执行任务。 3. 阻塞状态(Blocked):线程在等待某个锁或者I/O操作完成。 4. 等待状态(Waiting):线程在调用wait()方法后,等待被唤醒。 5. 计时等待状态(Timed Waiting):线程在调用sleep()、join()等方法后,等待一定的时间后继续执行。 6. 结束状态(Terminated):线程任务执行完毕或者抛出了异常,线程结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值