线程状态总结:
新建状态(new),也叫初始化状态,也就是new一个线程后,JVM为其分配内存,初始化变量
可运行状态(Runnable),也叫就绪状态,虚拟机创建栈和程序计数器,等待CPU时间片,等待调度
运行状态(Running),获得时间片,.run()方法运行,线程处于运行状态
堵塞状态(BLOCKED),某种原因放弃cpu使用权,让出cpu时间片,直到线程进入可运行状态。一般有三种阻塞情况,等待阻塞,执行.wait()方法,放入等待队列 。同步阻塞,线程获取对象同步锁时,同步锁被其他线程占用,JVM则放入锁池中,其他阻塞,调用IO,jion(),sleep()
结束状态(TERMINATED,terminated),表示线程执行结束。
起始还有两种:
等待状态(WAITING),需要等待其他线程做出一些特定动作,如通知或中断。调用wait()
超时等待(TIMEDWAITING),经过一定时间被唤醒。调用sleep()
备注:
-
.start()
方法,会使线程从 “新建状态” 转变为 “就绪状态”。
线程会以下面三种方式结束,结束后就是死亡状态
一个线程为什么不能两次调用start()
在java中,一个线程只能调用一个start()方法,第二次调用会抛出异常IllegalThreadStateException非法的线程状态异常。一个线程本身是具备一个完整的生命周期,(介绍Java的五种生命周期·)
当我们第一次调用start方法时,线程状态就可能处于终止或非new状态,再调用一次start方法,就相当于让该线程重新运行。不管从线程的安全性问题,还是线程本身的执行逻辑,都是不合理的。
因此,为了避免这个问题,每次线程运行时都会去判断当前线程的状态。