Java并发编程之线程生命周期

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章