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

简介: 大家好,上一篇主要主要是对多线程的了解,以及对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()方法。

相关文章
|
4天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
32 20
|
9天前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
2月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
79 1
|
4月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
79 1
|
4月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
66 3
|
4月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
43 2
|
4月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
68 2
|
4月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
71 1
|
4月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
82 1
|
4月前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
69 1

热门文章

最新文章

相关实验场景

更多