美文网首页
Java多线程:线程状态

Java多线程:线程状态

作者: 垃圾简书_吃枣药丸 | 来源:发表于2020-06-10 19:32 被阅读0次

# 面试题

  • Java中线程有哪几种状态,线程的生命周期。
  • 每个状态的含义。
  • 状态之间的转化过程以及触发条件,图示。

# 线程有哪几种状态

  • Java doc
image.png
  1. New (刚创建出线程实例)
    • new Thread()
  2. Runnable (可运行/运行状态,等待CPU的调度)(要注意:即使是正在运行的线程,状态也是Runnable,而不是Running)
    • 调用了thread.start()启动线程。
    • synchronized标记的代码,获取到同步监视器。
    • obj.notify()唤醒线程。
    • obj.notifyAll()唤醒线程。
    • obj.wait(time), thread.join(time)等待时间time耗尽。
  3. Blocked (阻塞状态)
    • 运行被synchronized标记的代码且未获取到同步监视器。
  4. Waiting (不超时等待状态)
    • threadA中调用threadB.join(),threadA将Waiting,直到threadB终止。
    • obj.wait() 释放同步监视器obj,并进入阻塞状态。
  5. TimedWaiting (等待指定时间time)。
    • threadA中调用threadB.join(time)
    • obj.wait(time)
    • sleep(time)
  6. Terminated (线程终止)
    • 线程正常执行完毕。
    • 发生了未捕获的异常。

# 注意

  • 由于wait()/wait(time)导致线程处于Waiting/TimedWaiting状态,当线程被notify()/notifyAll()/wait等待时间到之后,如果没有获取到同步监视器。会直接进入Blocked阻塞状态。

# 线程状态转换图示

image.png

# 代码演示

  1. New/Runnable/Terminated
/**
 * 线程的状态演示:NEW,Runnable,Terminated
 *
 * @author futao
 * @date 2020/6/7
 */
public class NewRunnableTerminated implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }

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

        System.out.println("因为还未调用start(),所以预期`New`:" + thread.getState());
        thread.start();
        //等待子线程跑一会,看看运行中的状态是不是Runnable
        Thread.sleep(10L);
        System.out.println("线程start()之后,预期Runnable:" + thread.getState());

        //等待子线程执行完毕,再查看其状态
        Thread.sleep(1000L);
        System.out.println("线程任务执行完毕,预期Terminated:" + thread.getState());
    }
}
  • 结果


    image.png
image.png image.png
  1. Blocked,Waiting,TimedWaiting
/**
 * 演示Blocked,Waiting,TimedWaiting
 *
 * @author futao
 * @date 2020/6/7
 */
public class BlockedWaitingTimedWaiting implements Runnable {
    @Override
    public void run() {
        try {
            sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 同步方法
     *
     * @throws InterruptedException
     */
    public synchronized void sync() throws InterruptedException {
        Thread.sleep(1000L);
        wait();
    }

    public static void main(String[] args) throws InterruptedException {
        BlockedWaitingTimedWaiting blockedWaitingTimedWaiting = new BlockedWaitingTimedWaiting();

        Thread thread1 = new Thread(blockedWaitingTimedWaiting);
        Thread thread2 = new Thread(blockedWaitingTimedWaiting);

        thread1.start();
        //为了尽可能让thread1先执行,获取到同步方法的锁
        Thread.sleep(10L);
        thread2.start();

        Thread.sleep(500L);
        System.out.println("因为thread1处于sleep(time)状态,所以预期线程状态为<TimedWaiting>: " + thread1.getState());
        System.out.println("因为sync()方法的锁被thread1持有,所以thread2被阻塞,预期状态为<Blocked>: " + thread2.getState());


        //等待thread1的sleep(time)时间结束,进入wait()方法
        Thread.sleep(1000L);
        System.out.println("因为thread1的sleep(time)时间结束,进入wait()方法,所以预期thread1的线程状态为<Waiting>:" + thread1.getState());
    }
}
image.png

欢迎在评论区留下你看文章时的思考,及时说出,有助于加深记忆和理解,还能和像你一样也喜欢这个话题的读者相遇~

# 本文源代码

# 系列文章

image.png image.png

相关文章

  • java多线程基础

    多线程 线程,进程,多线程 一、java线程 1. 线程状态 2. 线程方法 方法说明setPriority(in...

  • Java并发编程(二)同步

    如果你的java基础较弱,或者不大了解java多线程请先看这篇文章java多线程(一)线程定义、状态和属性 同步一...

  • JAVA多线程及线程状态转换

    Java多线程及线程状态转换 - 祖华 - 博客园

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • Java知识梳理六

    一、Java多线程一 1.谈谈线程的生命周期和状态转移 关于线程生命周期的不同状态,在Java 5以后,线程...

  • Android开发 Java线程基础

    简介 本篇文章是带大家了解 Java多线程的基础知识.主要内容: 介绍多线程的概念, 了解多线程的优点, 状态, ...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • 多线程知识点整理

    1、多线程基础 线程的生命周期(状态)NEW:就绪状态Java线程刚刚被创建,调用start()方法之后不代表线程...

网友评论

      本文标题:Java多线程:线程状态

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