基于java 线程的几种状态(详解)

基于 Java 线程的几种状态(详解)

在 Java 语言中,线程是一种非常重要的概念。线程可以被分为多个状态,在不同的状态下,线程的行为和特征是不同的。本文将详细介绍基于 Java 线程的几种状态,并通过两个示例来演示它们。

线程的状态

在 Java 中,线程有以下几种状态:

  • 新建状态(New):线程尚未启动,处于新建状态。
  • 运行状态(Running):线程正在执行运行代码。
  • 阻塞状态(Blocked):线程被阻塞了,等待某个条件的到来,例如等待 I/O 完成,或等待某个锁的释放。
  • 等待状态(Waiting):线程在等待某个条件的唤醒,例如等待用户输入,或等待某个状态的改变。
  • 计时等待状态(Timed Waiting):线程正在等待某个条件的唤醒,但是在等待的过程中,可以设置一个超时时间,如果超时还没有被唤醒,线程也会自行唤醒。
  • 终止状态(Terminated):线程已经执行完毕,进入终止状态。

示例一

下面的代码演示了多个线程在不同状态下的行为。

public class ThreadStatesDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // 进入运行状态
                System.out.println("Thread 1 is running...");
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (ThreadStatesDemo.class) {
                    // 进入阻塞状态
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 进入等待状态
                    System.out.println("Thread 3 is waiting for user input...");
                    System.in.read();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t4 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 进入计时等待状态
                    System.out.println("Thread 4 is waiting for 5 seconds...");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // 启动所有线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();

        // 等待所有线程执行完毕
        t1.join();
        t2.join();
        t3.join();
        t4.join();

        // 所有线程执行完毕
        System.out.println("All threads have terminated.");
    }
}

在上面的示例代码中,我们启动了四个线程,分别进入不同的状态。具体来说:

  • 线程 t1 进入了运行状态,因为它没有任何被阻塞的代码。
  • 线程 t2 进入了阻塞状态,因为它在一个 synchronized 块中等待着另一个线程释放同步锁。
  • 线程 t3 进入了等待状态,因为它在等待用户输入。
  • 线程 t4 进入了计时等待状态,因为它在等待 5 秒钟之后会自动唤醒。

示例二

我们可以用一个稍微复杂一些的例子来说明线程状态的变化。

public class ThreadStatesDemo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (ThreadStatesDemo2.class) {
                    System.out.println("Thread 1 has acquired the lock, will sleep for 5 seconds");
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (ThreadStatesDemo2.class) {
                    System.out.println("Thread 2 has acquired the lock");
                }
            }
        });

        // 启动线程 t1,它会拿到锁并且休眠 5 秒钟,t2 获取锁之后等待 10 秒钟
        t1.start();
        Thread.sleep(500);
        t2.start();
        Thread.sleep(10000);

        // t1 已经醒来并且释放了锁,t2 继续往下执行
        System.out.println("Thread 2 is still running after 10 seconds");
        Thread.sleep(5000);

        // 等待线程执行完毕并退出
        t1.join();
        t2.join();
    }
}

在这个例子中,我们启动了两个线程 t1t2t1 进入了阻塞状态,等待 5 秒钟之后醒来并且释放锁。t2 在启动之后,需要等待 5 秒钟才能获取锁并且继续往下执行。在这个过程中,t1t2 的状态都发生了变化,具体如下:

  • 线程 t1 进入了阻塞状态,因为它在一个 synchronized 块中等待着另一个线程释放同步锁。
  • 线程 t2 进入了阻塞状态,因为它在一个 synchronized 块中等待着另一个线程释放同步锁。
  • 线程 t1 进入了计时等待状态,因为它在等待 5 秒钟之后会自动唤醒。
  • 线程 t2 进入了等待状态,因为它在等待另一个线程释放锁。
  • 线程 t2 进入了计时等待状态,因为它在等待 5 秒钟之后会自动唤醒。

结论

在 Java 中,线程有多种状态,每种状态都有其特点和行为。正确理解线程的状态可以帮助程序员编写出更加高效的多线程程序。在官方文档和其他实践指南中,作者提供了更多的线程状态改变的示例和详细解释。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于java 线程的几种状态(详解) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Go语言实现一个简单的并发聊天室的项目实战

    下面我将为你详细讲解“Go语言实现一个简单的并发聊天室的项目实战”的完整攻略。 1. 确定项目需求 在开始我们的项目之前,需要先明确项目需求。这是任何项目开始之前都必须要做的。在聊天室项目中,我们需要实现以下需求: 支持多个用户同时在线 用户能够发送消息到聊天室中 用户能够接收到来自其他用户的消息 用户能够退出聊天室 2. 设计数据结构 在开始编写代码之前,…

    多线程 2023年5月17日
    00
  • 学习Java多线程之同步

    学习Java多线程之同步,首先需要明确什么是同步。同步是指在多个线程并发执行时,保证多个线程对共享资源的安全访问。下面是一个完整攻略,希望对您有所帮助。 目录 理解同步概念 实现同步 理解同步概念 在多线程环境下,由于线程的执行顺序不是我们能控制的,如果多个线程同时访问共享资源,可能会导致不可预料的行为。比如,每个线程都想更改同一个变量的值,那么变量的最终值…

    多线程 2023年5月16日
    00
  • python编程使用协程并发的优缺点

    Python编程使用协程并发的优缺点 什么是协程并发 “协程并发”指同时执行多个协程,在这些协程之间切换执行,实现并发的效果。这种并发实现方式相对于线程和进程有很大的优势,可以提高系统性能,减少资源占用。 协程并发的优点 更高的执行效率 协程并发能够减少系统资源的消耗,因此可以实现更高的执行效率。相对于线程或者进程,协程在切换时不需要进行上下文的切换,因此执…

    多线程 2023年5月16日
    00
  • 浅谈Nginx10m+高并发内核优化详解

    浅谈Nginx10m+高并发内核优化详解 Nginx 10m+高并发场景分析 Nginx是一个高性能、高并发的Web服务器,广泛应用于互联网企业和大型网站等高并发场景。在高并发的场景下,Nginx的性能极为重要,如何优化Nginx的性能成为了Web开发人员必须掌握的技能。下面我们就来分析一下Nginx在10m+高并发场景下的性能瓶颈和优化方案。 性能瓶颈分析…

    多线程 2023年5月16日
    00
  • java中Redisson的看门狗机制的实现

    Redisson是基于Redis实现的分布式对象服务的Java客户端,支持众多的分布式锁和数据结构。Redisson提供了看门狗机制,可以保证分布式锁的安全性和可靠性。下面是Java中Redisson的看门狗机制的实现完整攻略。 什么是Redisson的看门狗机制 Redisson的看门狗机制是在获取锁时,同时启动一个看门狗线程,定时续期锁的时间。当锁的过期…

    多线程 2023年5月17日
    00
  • java多线程Thread的实现方法代码详解

    Java多线程Thread的实现方法代码详解 1. 什么是多线程? 多线程是指在一个程序中,同时运行多个线程,每个线程都独立执行不同的任务。相对于单线程程序,多线程具有以下优点: 提高程序的执行效率 提高程序的响应速度 可以简化程序设计 在Java语言中,可以使用Thread类和Runnable接口来实现多线程。 2. Thread类的使用 2.1 继承Th…

    多线程 2023年5月17日
    00
  • Java并发编程数据库与缓存数据一致性方案解析

    Java并发编程数据库与缓存数据一致性方案解析 需要解决的问题 在Web应用中,数据通常存储在数据库中,为了提高读取速度,还会加入缓存机制。这就引出了一个问题:如何保证数据库与缓存中的数据一致性? 解决方案 1. 读取时双重检查 在读取缓存数据时,先从缓存中读取,如果缓存不存在,则从数据库中读取,并将数据存储到缓存中。这里需要注意的是,为了防止在读取缓存数据…

    多线程 2023年5月16日
    00
  • MySQL中大对象的多版本并发控制详解

    MySQL中大对象的多版本并发控制详解 在 MySQL 中,大对象(LOB)指的是二进制数据或者文本数据,它的存储方式与表中的其他字段不同。在使用大对象字段进行多表连接或者并发更新的时候,有可能会出现数据并发问题。因此,MySQL 中采用多版本并发控制(MVCC)机制来保证大对象的数据一致性和可靠性。 MVCC机制是什么 多版本并发控制(MVCC)是指为了解…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部