美文网首页
Java 线程生命周期

Java 线程生命周期

作者: qyfl | 来源:发表于2020-01-02 17:56 被阅读0次

线程的六种状态:

  • New
  • Runnable
  • Blocked
  • Waiting
  • Timed Waiting
  • Terminated

状态之间的关系如下:

线程状态

验证

首先验证 New,Runnable,Terminated 三个状态。

public class NewRunnableTerminated implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new NewRunnableTerminated());

        // 线程新建则进入 NEW
        System.out.println(thread.getState());

        // 程序运行就进入 Runnable
        thread.start();
        System.out.println(thread.getState());

        // 程序运行中的状态也是 Runnable,这个 sleep 的时间要稍短,不能等线程执行结束在调用
        Thread.sleep(1);
        System.out.println(thread.getState());

        // 程序运行结束状态是 Terminated,这个 sleep 的时间要稍长,等线程执行结束
        Thread.sleep(100);
        System.out.println(thread.getState());
    }

    @Override
    public void run() {
        int j = 0;
        for (int i = 0; i < 10000000; i++) {
            j++;
        }
    }
}

验证 Block,WaitingTimed,Waiting 三个状态。

public class BlockWaitingTimedWaiting implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        BlockWaitingTimedWaiting runnable = new BlockWaitingTimedWaiting();
        Thread thread1 = new Thread(runnable);
        thread1.start();

        Thread thread2 = new Thread(runnable);
        thread2.start();

        // 打印 TimedWaiting 状态,因为正在 sleep
        System.out.println(thread1.getState());

        // 打印 blocked 状态,因为 thread2 想拿锁拿不到。
        System.out.println(thread2.getState());

        // 等待时间稍长,让子线程运行 wait()
        Thread.sleep(1300);
        System.out.println(thread1.getState());
    }

    @Override
    public void run() {
        syn();
    }

    private synchronized void syn() {
        try {
            Thread.sleep(1000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

总结

  • 如上图所示,左侧的三个状态是从上往下的,是不能回去的。右侧的三个状态则是可以反复进入的。
  • 一般习惯,把 Blocked,Waiting,TimedWaiting 都成为阻塞状态。

相关文章

网友评论

      本文标题:Java 线程生命周期

      本文链接:https://www.haomeiwen.com/subject/ppeooctx.html