1. 线程生命周期:六种状态
如下图所示:
- NEW:创建线程之后还没有执行start方法,此时线程处于NEW状态
- RUNNABLE:执行start方法之后,处于RUNNABLE状态,是可运行状态。对应着操作系统READY(为获取到CPU)和RUNNING(获取到CPU)两种状态,这两种状态在这里都是可运行状态。
- BLOCKED:
1. 当前线程等待另外一个线程释放monitor锁,以期待进入到synchronized修饰的方法或代码块,此时还没有进入到该方法或代码块中,则进入到BLOCKED状态;
2. 当从t1线程从WAITING状态唤醒后,t1通常不能立即获取到锁,因为另外一个唤醒t1线程的线程t2可能还没执行完,那么t1会先进入到BLOCKED状态,抢到锁后再进入到RUNNABLE状态; - WAITING:必须在synchorized修饰的方法或代码块中执行了Object.wait()或Thread.join()后进入到WAITING状态,等待其他线程去唤醒;
- TIME_WAITING:比WAITING状态的方法多了时间参数,在超时后会被自动唤醒,如果超时之前执行notify()或notifyAll()可以提前唤醒
- TERMINATED:
1. run方法执行完毕;
2. 出现异常;
PS:BLOCKED状态和WAITING状态都是未获得锁,但是BLOCKED状态是没有执行wait方法时线程具有的状态或者被其他线程执行了notify方法唤醒后(这个时候还没有获取到锁)具有的状态,而WAIT状态时执行了wait方法后没有被唤醒时具有的状态。
以下是代码演示:
public class NewRunnableTerminated implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new NewRunnableTerminated());
System.out.println(thread.getState());
thread.start();
System.out.println(thread.getState());
Thread.sleep(1000);
System.out.println(thread.getState());
}
}
NEW
RUNNABLE
TERMINATED
public class BlockedWaitingTimeWaiting implements Runnable {
@Override
public void run() {
syn();
}
private synchronized void syn(){
try {
Thread.sleep(2000);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
BlockedWaitingTimeWaiting blockedWaitingTimeWaiting = new BlockedWaitingTimeWaiting();
Thread t1 = new Thread(blockedWaitingTimeWaiting);
t1.start();
Thread.sleep(500);//让t1先启动
Thread t2 = new Thread(blockedWaitingTimeWaiting);
t2.start();
System.out.println(t1.getState());//Thread.sleep(2000)使t1进入BLOCKED状态
System.out.println(t2.getState());//t1没有释放锁,是t1进入BLOCKED状态
Thread.sleep(2000);
System.out.println(t1.getState());//wait()使t1进入到WAITING状态
}
}
TIMED_WAITING
BLOCKED
WAITING
阻塞状态:
- 一般地,Blocked、Waiting、TimedWaiting都称为阻塞状态
- 不仅仅是Blocked