【多线程】基础 | 线程的状态

简介: 大家好,上一篇主要主要是对多线程的了解,以及对Thread的start方法,进行了源码的跟踪,今天我们主要来说一说其他的状态。

前言

大家好,上一篇主要主要是对多线程的了解,以及对Thread的start方法,进行了源码的跟踪,今天我们主要来说一说其他的状态。

网络异常,图片无法展示
|

主要状态

// Thread.State 源码
public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

1. RUNNABLE-正在运行状态

看一下Thread源码中对Runnable的介绍

/**
 * Thread state for a runnable thread.  A thread in the runnable
 * state is executing in the Java virtual machine but it may
 * be waiting for other resources from the operating system
 * such as processor.
 */
 Java线程的RUNNABLE状态其实是包括了传统操作系统线程的ready和running两个状态的。

话不多说,接下来直接用一段demo来体现

public class deadLock {
    private final Object objectA = new Object();
    private final Object objectB = new Object();
    private AtomicInteger atomicInteger = new AtomicInteger(0);
    public void testA() throws InterruptedException {
        synchronized (objectA){
            Thread.sleep(3000);
            synchronized (objectB){
                System.out.println("objectB");
            }
        }
    }
    public void testB() throws InterruptedException {
        synchronized (objectB){
            Thread.sleep(3000);
            synchronized (objectA){
                System.out.println("objectA");
            }
        }
    }
    static class Thead0 implements Runnable{
        private deadLock deadLock;
        public Thead0(deadLock deadLock) {
            this.deadLock = deadLock;
        }
        @Override
        public void run() {
            try {
                deadLock.testA();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    static class Thead1 implements Runnable{
        private deadLock deadLock;
        public Thead1(deadLock deadLock) {
            this.deadLock = deadLock;
        }
        @Override
        public void run() {
            try {
                deadLock.testB();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        deadLock DeadLock = new deadLock();
        Thread thread = new Thread(new deadLock.Thead0(DeadLock));
        Thread thread1 = new Thread(new deadLock.Thead1(DeadLock));
        thread.start();
        //表示线程正在运行中
        System.out.println("RUNNABLE:"+thread.getState());
        thread1.start();
        System.out.println("RUNNABLE:"+thread1.getState());
        System.out.println("TIMED_WAITING:"+thread.getState());
        try {
            Thread.sleep(3000);
            } catch (InterruptedException e) {
            e.printStackTrace();
            }
        System.out.println("BLOCKED:"+thread.getState());
    }
}

这是一个死锁的例子,通过ThreadA与ThreadB互相抢占资源,造成线程的等待,通过图中我们可以根据打印出来的state,了解线程所处的阶段。

2. BLOCKED-阻塞状态

上面的demo中,A和B的资源互相抢占,在最后的时候输出state的状态是BLOCKED,处于BLOCKED状态的线程正等待锁的释放以进入同步区。

3. WAITING-等待状态

造成WAITING状态的方法

//使当前线程处于等待状态直到另一个线程唤醒它
Object.wait();
//等待线程执行完毕,底层调用的是Object实例的wait方法
Thread.join();

4. TIMED_WAITING-超时等待状态

线程等待一个具体的时间,时间到后会被自动唤醒。

//使当前线程睡眠指定时间
Thread.sleep(long)
//线程休眠指定时间,使当前线程处于等待状态直到时间结束,或者调用notify方法唤醒
Object.wait(long)
//等待当前线程最多执行millis毫秒,如果millis为0,则会一直执行
Thread.join(long)

5. TERMINATED-终止状态

//中断该线程
Thread.interrupt()
//判断当前线程是否已经中断
Thread.interrupted()
Thread.isInterrupted()

下一篇,我们先对Object.wait()进行一波分析。

带着问题我们先来思考一下

  1. 为什么调用Object.wait必须持有对象锁?
  2. Object.wait()被挂起后,是否会释放当前锁,让出CPU?

下一篇,我们再继续来图解wait()、notify()、join()方法。

相关文章
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
38 1
C++ 多线程之初识多线程
|
16天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
16天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
13 2
|
16天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
16天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
16天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
28 1
|
16天前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
21 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
44 6
|
29天前
|
存储 运维 NoSQL
Redis为什么最开始被设计成单线程而不是多线程
总之,Redis采用单线程设计是基于对系统特性的深刻洞察和权衡的结果。这种设计不仅保持了Redis的高性能,还确保了其代码的简洁性、可维护性以及部署的便捷性,使之成为众多应用场景下的首选数据存储解决方案。
38 1