Java多线程 线程状态原理详解

Java多线程 线程状态原理详解

介绍

Java中的线程可以并行执行多个代码块,既可提高程序执行效率,又可防止程序因某些阻塞造成“卡死”。

线程状态就是指线程在代码执行期间所处的不同运行状态,进而影响着线程的执行顺序及资源分配。在Java中,线程状态主要由以下5种状态组成:

  • 新建状态(New)
  • 就绪状态(Runnable)
  • 阻塞状态(Blocked)
  • 等待状态(Waiting)
  • 死亡状态(Terminated)

下面我们将分别详细讲解这5种状态,以及这些状态间的转换关系。

新建状态(New)

当一个Thread类的实例被创建时,该实例处于新建状态(New)。此时,线程实例仅被创建,但尚未开始执行。具体代码如下:

Thread t = new Thread();

就绪状态(Runnable)

当一个线程实例被创建,且调用了start方法,此时线程将进入就绪状态(Runnable),等待执行。在该状态下,线程实例已经被加入当前进程的执行队列中,并与其他线程处于竞争状态,谁的优先级高,谁将被先执行。具体代码如下:

Thread t = new Thread();
t.start();

阻塞状态(Blocked)

线程在执行过程中,如果发现自身要访问的资源被占用,则会进入阻塞状态(Blocked)。此时,该线程将会进入“睡眠”状态,等待获取到需要访问的资源,才有可能被重新调度执行。当线程被阻塞时,会释放当前所持有的锁。以下示例代码演示阻塞状态的运行流程:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (this) {
            try {
                // 等待1000毫秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});
t.start();

synchronized (t) {
    // 再次等待1000毫秒
    Thread.sleep(1000);
}

// 输出BLOCKED
System.out.println(t.getState());

上述代码中,线程t被加入了一个同步代码块,并在其中等待1000毫秒。接着,主线程又获取了该同步代码块的锁,并在同步代码块中等待1000毫秒,此时t被阻塞。最后,输出t的线程状态,其状态为BLOCKED。

等待状态(Waiting)

当线程处于等待状态(Waiting)时,此时线程需要等待其他线程执行结束或者持有锁的线程释放锁。一个线程在进入等待状态后,只有等待其他线程调用notify或notifyAll方法以通知该线程才能重新调度执行。以下示例演示等待状态的运行流程:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (this) {
            try {
                // 进入等待状态,并释放锁
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});
t.start();

// 输出WAITING
System.out.println(t.getState());

// 等待线程被唤醒
synchronized (t) {
    t.notify();
}

在上述代码中,线程t被加入了一个同步代码块,并在其中进入等待状态,并释放锁。然后,输出t的线程状态,其状态为WAITING。接着,主线程在同步代码块中唤醒了t,此时t的状态将变为RUNNABLE。

死亡状态(Terminated)

当线程执行到run方法的末尾,或者在运行过程中出现了未捕获的异常,线程将会进入死亡状态(Terminated)。此时,线程实例已经被销毁,不能再次进入其他状态。以下示例代码演示了如何让线程进入死亡状态:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
});
t.start();

// 让主线程等待t线程执行完毕
t.join();

// 输出TERMINATED
System.out.println(t.getState());

在上述代码中,线程t被创建并启动,然后主线程调用了t.join()方法,等待t线程执行完毕。执行完毕后,输出t的状态,其状态被修改为TERMINATED。

总结

Java中的线程状态主要有5种状态,分别是新建状态(New)、就绪状态(Runnable)、阻塞状态(Blocked)、等待状态(Waiting)和死亡状态(Terminated)。这些状态间的转换是由JVM内部自动控制的,我们只需要专注于相应的业务代码中即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程 线程状态原理详解 - Python技术站

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

相关文章

  • GO中sync包自由控制并发示例详解

    在Go语言中,sync包提供了许多同步原语和锁,可以在并发编程中实现不同的控制并发的方式。下面是关于如何自由控制并发的示例详解。 使用WaitGroup控制并发执行 使用sync包的WaitGroup类型,可以实现并发执行多个任务,并等待所有任务完成后再执行后续操作的功能。WaitGroup内部有一个计数器,每增加一个goroutine,计数器加1,每个go…

    多线程 2023年5月17日
    00
  • Java中同步与并发用法分析

    Java中同步与并发用法分析 同步 在Java中,同步是指多个线程之间访问共享资源的时候,保证线程安全的机制。Java提供了两种机制来实现同步:synchronized关键字和Lock接口。 synchronized关键字 synchronized关键字可以用于修饰方法或代码块。被修饰的方法或代码块在同一时间只能被一个线程执行,其他线程需要等待。 示例代码:…

    多线程 2023年5月16日
    00
  • C++基于reactor的服务器百万并发实现与讲解

    C++基于Reactor的服务器百万并发实现与讲解 简介 该攻略将介绍基于Reactor模式实现高并发服务器的过程。Reactor模式是一种常见的多路复用I/O技术,用于实现高并发环境下的网络服务器。Reactor模式基于IO多路复用,通过事件驱动的方式,将网络I/O事件分发给对应的处理函数,从而实现高效的I/O操作。 本攻略将着重介绍基于C++实现Reac…

    多线程 2023年5月17日
    00
  • 浅谈C#多线程简单例子讲解

    下面我来详细讲解“浅谈C#多线程简单例子讲解”的完整攻略。 1. 多线程基础知识 在进行C#多线程编程之前,需要掌握以下基础知识: 线程的定义和生命周期 线程的状态和状态转换 线程同步和互斥 线程池的使用 此外,了解异步编程和并发编程的相关知识也是非常有益的。可以参考官方文档或相关书籍进行学习。 2. 多线程的简单实现 下面我们通过两个简单的例子来介绍C#多…

    多线程 2023年5月17日
    00
  • mysql中insert并发问题(on DUPLICATE KEY UPDATE)

    MySQL中的INSERT操作是非常常见的操作,但是在高并发的情况下,INSERT操作可能会出现一些问题,这就是INSERT并发问题。具体来说,当多个用户同时向一个表中进行INSERT操作时,就会有并发问题出现,可能会导致数据错乱、重复插入等问题。为了解决这个问题,MySQL引入了一个非常有用的特性:ON DUPLICATE KEY UPDATE。 ON D…

    多线程 2023年5月17日
    00
  • 浅谈Go语言并发机制

    浅谈Go语言并发机制 Go语言并发简介 并发是指同时执行多个任务的能力。Go语言内置了并发编程的支持,可以非常方便地编写高并发程序。 Go语言的并发模型依赖于go函数和channel这两个基本元素。 Go函数 在Go语言中,我们可以用go关键字来启动一个goroutine(轻量级线程),goroutine的调度由Go语言运行时完成。 以下是一个启动gorou…

    多线程 2023年5月17日
    00
  • Python 多线程Threading初学教程

    Python 多线程Threading初学教程 简介 在一些需要同时执行多个任务的场景下,使用Python多线程Threading可以有效提高程序的运行效率。本教程将为初学者详细讲解Python多线程的使用方法、常用属性和方法、以及附带两条示例说明。 创建线程 Python多线程的模块是Thread。可以使用该模块中的Thread类来创建线程。Thread中…

    多线程 2023年5月17日
    00
  • Yii+MYSQL锁表防止并发情况下重复数据的方法

    在 Yii 中,我们可以使用 MYSQL 锁表的方式来防止并发情况下重复数据的产生。下面是完整攻略的步骤: 步骤一:准备工作 在开始之前,确保已经完成了以下准备工作: 已经安装好了 Yii 框架以及 MYSQL 数据库 有相应的表格需要进行锁定 步骤二:检查并发情况下的数据重复 在进行 MYSQL 锁表之前,必须先检查并发情况下的数据重复。可以通过以下方法实…

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