认识线程的状态
为了复习Java多线程的知识,经过查看资料后通过自己的理解与认识,先画出了一张线程几种状态之间的转换过程图,然后再对几种状态进行具体描述。
1、初始状态
初始状态也就是new状态,也就是当我们写到new Thread()的时候,创建了一个新线程,但是该线程还没运行,还没有线程任务可做。
2、可运行状态
可运行状态不是执行了run方法就是可运行状态,而是调用start方法。表明这个线程是可以有资格运行的,主要分三种情况:
- 这时候的线程就等到时间片轮转到自己,这样就可以抢占到CPU,进行Running状态。
- 当到Running状态之后并没有运行run方法执行任务,而可能是由于时间片(yied方法:做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会)用完回到Runanble状态。
- 当处于锁定状态的线程结束当前的锁定Blocked状态之后,重新回到Runnable状态。
3、阻塞状态
阻塞状态主要分为三种,由状态图中就可以知道。
等待阻塞:当线程运行时候,执行了某个对象的wait方法,就会将此线程放入到wait等待池中。
锁定阻塞:当线程运行时,想要获得某个对象的synchronized同步锁,但是这时候锁已经被其他线程占用,那么该未获得对象锁的线程就会被放入锁池,从而导致阻塞。
- 其他阻塞:当线程执行了sleep方法、调用了其他线程的join方法(join方法:就是让其他线程先执行,那么该线程就会被阻塞,其他线程执行完后该线程才执行,其底层方法是wait)、或者用户I/O请求就会进入阻塞状态(这种情况很好理解,我们在main方法中I/O,就会让Console控制台输入之后才main主线程执行)。
注:从等待阻塞到锁定阻塞,是其他线程调用了notify()或者notifyAll()方法
- 线程A在调用了对象的wait方法进入等待状态,B线程调用了该对象的notifyAl()方法唤醒了全部的线程,从而A线程在就锁定队列中等待获得锁对象。
- B线程调用了该对象的notify()方法唤醒了一个线程,但是具体是哪个线程弄不清楚。
4、正在运行状态
正在运行状态就是线程很顺利的获得了时间片,执行run方法中的线程任务,但是正在运行状态的线程可能会被打断从而变为Blocked状态或者回退到Runnable状态。
5、死亡状态
即终止Terminated状态,其发生的原因一般有两个
- 正常执行完run方法后线程结束进入死亡状态
- 可能会因为一个没有Catch到的Exception而让线程run方法意外终止,这时候线程就进入了终止死亡状态。