美文网首页并发编程
一、线程的状态转换

一、线程的状态转换

作者: liyc712 | 来源:发表于2020-08-29 09:28 被阅读0次

线程的状态转换

threadStatus_01.png

线程的6个状态

New

线程刚创建的状态;

Runnable

调用start()后的状态,可以对应操作系统的ready running状态;

Blocked

进入到synchronized修饰的代码块或方法并已经被其他线程获得monitor锁;
注意:一定是遇到synchronized才会出现,其他的锁虽然也会是线程陷入等待,但是不会使线程从Runnable进入到Blocked状态;

当获得了monitor锁就会回到Runnable状态;

Waiting

使线程从Runnable进入到Waiting等待的方法

  • Object.wait()
  • Thread.join()
  • LockSupport.park()

唤醒正在等待线程的方法,是线程从Waiting到Runnable

  • Object.notify()
  • Object.notifyAll()
  • LockSupport.unpark()

Timed Waiting

使线程从Runnable进入到Timed Waiting倒计时等待的方法

  • Thread.sleep(time)
  • Object.wait(time)
  • Thread.join(time)
  • LockSupport.parkNanos(time)
  • LockSupport.parkUntil(time)

唤醒倒计时正在等待线程的方法,是线程从Timed Waiting到Runnable
等待时间到

  • Object.notify()
  • Object.notifyAll()
  • LockSupport.unpark()

Terminated

执行完成或者抛出异常

注意:

  • 1.一般情况Waiting,Timed Waiting,Blocked不能相互转换,只能分别被和Runnable相互转换。
    • a.但是有两个特殊情况需要注意:从Object.wait()状态刚被唤醒时,通常不能立刻抢到monitor锁(可能唤醒它的线程还没有释放锁,也可能被别的线程抢到了),那就会从Waiting先进入到Blocked状态,抢到锁后再转换到Runnable状态(官网)。
    • b.如果发生异常,可以直接跳到终止Terminated状态,不必再遵循路径,比如可以从Waiting直接到Terminated。
  • 2.New->Runnable->Terminated 只能按顺序转换,不能倒叙转换,如果一个线程已经Terminated了,又想执行任务,只能新建线程。

展示线程的NEW、RUNNABLE、Terminated状态。即使是正在运行,也是Runnable状态,而不是Running。

/**
 * 描述:展示线程的NEW、RUNNABLE、Terminated状态。即使是正在运行,也是Runnable状态,而不是Running。
 */
public class NewRunnableTerminated implements Runnable {

    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        //打印出NEW的状态
        System.out.println(thread.getState());
        thread.start();
        System.out.println(thread.getState());
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出RUNNABLE的状态,即使是正在运行,也是RUNNABLE,而不是RUNNING
        System.out.println(thread.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出TERMINATED状态
        System.out.println(thread.getState());
    }

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }
}
    /**
     *
     * 输出结果:
     * NEW
     * RUNNABLE
     * 0
     * 1
     * 2
     * 3
     * ……
     * RUNNABLE
     * ……
     * 998
     * 999
     * TERMINATED
     *
     *
     */

展示Blocked, Waiting, TimedWaiting

**
 * 描述:展示Blocked, Waiting, TimedWaiting
 */
public class BlockedWaitingTimedWaiting implements Runnable{
    public static void main(String[] args) {
        BlockedWaitingTimedWaiting runnable = new BlockedWaitingTimedWaiting();
        Thread thread1 = new Thread(runnable);
        thread1.start();
        Thread thread2 = new Thread(runnable);
        thread2.start();
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出Timed_Waiting状态,因为正在执行Thread.sleep(1000);
        System.out.println(thread1.getState());
        //打印出BLOCKED状态,因为thread2想拿得到sync()的锁却拿不到
        System.out.println(thread2.getState());
        try {
            Thread.sleep(1300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印出WAITING状态,因为执行了wait()
        System.out.println(thread1.getState());

    }

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

    private synchronized void syn() {
        try {
            Thread.sleep(1000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    /**
     * 输出:
     * TIMED_WAITING
     * BLOCKED
     * WAITING
     */
}

相关文章

  • Java 线程的七种状态

    本篇感性地介绍一下 Java 线程的七种状态以及状态之间的转换 Java 线程状态转换图 Java 线程状态 在 ...

  • 笔记:Java多线程

    4. 线程状态的转换 线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待...

  • 一、线程的状态转换

    线程的状态转换 线程的6个状态 New 线程刚创建的状态; Runnable 调用start()后的状态,可以对应...

  • 线程状态转换

    http://www.cnblogs.com/wangle1001986/p/3593674.html

  • 线程状态转换

    线程是由内核自动调度的运行在进程上下文中的逻辑流。 基本概念 线程有自己的上下文:唯一的Thread ID、栈、栈...

  • 线程状态转换

    状态分类 线程一共有六种状态,分别为New、RUNNABLE、BLOCKED、WAITING、TIMED_WAIT...

  • Java线程状态及其转换

    线程状态及其转换 一、线程状态 Java中定义线程的状态有6种,可以查看Thread类的State枚举: 初始(N...

  • 多线程2:线程的状态转换以及基本操作

    线程的状态转换以及基本操作

  • 线程状态和调用方法

    一 线程状态以及互相之间的转换 线程状态可以分为5种: 1. 初始状态:新建了一个线程对象 2. 就绪状态:(可运...

  • 11.11-全栈Java笔记:线程状态转换和任务定时调度

    线程状态转换 图1线程的状态 1)New :创建好线程对象,但没有启动的时候。 一个线程调用start()之后不一...

网友评论

    本文标题:一、线程的状态转换

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