深入研究Java线程的几种状态及其对程序执行的影响

2024年 2月 22日 60.5k 0

深入研究java线程的几种状态及其对程序执行的影响

深入研究Java线程的几种状态及其对程序执行的影响

在Java中,线程是一种轻量级的执行单位,可以在程序中独立运行并执行特定的任务。线程的状态是描述线程在执行过程中的不同阶段,了解线程的状态对于编写多线程程序以及优化程序性能非常重要。本文将深入研究Java线程的几种状态以及它们对程序执行的影响,并提供具体的代码示例。

Java线程的几种状态包括:NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(定时等待)和TERMINATED(终止)。

  • 新建(NEW)状态:当通过创建Thread类的实例来新建一个线程时,线程处于新建状态。在新建状态中,线程尚未开始运行任何代码。下面是一个创建新线程的示例代码:
  • Thread thread = new Thread(() -> {
    System.out.println("Hello, World!");
    });

    登录后复制

  • 可运行(RUNNABLE)状态:当线程调用start()方法后,线程将进入可运行状态。在这个状态下,线程将等待CPU分配时间片,以便执行run()方法中的代码。如果有多个线程处于可运行状态,操作系统会根据调度策略为这些线程分配时间片。下面是一个示例代码:
  • Thread thread = new Thread(() -> {
    System.out.println("Hello, World!");
    });
    thread.start();

    登录后复制

  • 阻塞(BLOCKED)状态:当线程因为某些原因不能继续执行时,线程将进入阻塞状态。常见的原因包括等待锁、等待输入输出(I/O)等。在阻塞状态中,线程暂停执行,直到满足某个条件后才能继续执行。下面是一个使用synchronized关键字来实现线程同步的示例代码:
  • public class MyRunnable implements Runnable {
    private Object lock = new Object();

    public void run() {
    synchronized(lock) {
    System.out.println("In synchronized block");
    // 一些代码
    }
    }

    public static void main(String[] args) {
    MyRunnable runnable = new MyRunnable();
    Thread thread1 = new Thread(runnable);
    Thread thread2 = new Thread(runnable);

    thread1.start();
    thread2.start();
    }
    }

    登录后复制

    在上述代码中,两个线程尝试同时进入synchronized块,因为锁是共享的,所以第二个线程将进入阻塞状态,直到第一个线程执行完毕释放锁。

  • 等待(WAITING)状态:线程在以下情况下会进入等待状态:调用了wait()方法、调用了join()方法或者调用了LockSupport的park()方法。在等待状态中,线程不会主动执行任何代码,直到其他线程唤醒它或者等待时间到达。下面是一个使用wait()方法的示例代码:
  • public class MyThread extends Thread {
    public void run() {
    synchronized(this) {
    System.out.println("Waiting for next thread...");
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("Thread resumed.");
    }
    }

    public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();

    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized(thread) {
    thread.notify();
    }
    }
    }

    登录后复制

    在上述代码中,线程进入等待状态后,主线程通过notify()方法唤醒了该线程。

  • 定时等待(TIMED_WAITING)状态:线程在以下情况下会进入定时等待状态:调用了sleep()方法、调用了带有超时参数的join()方法、调用了带有超时参数的wait()方法、调用了LockSupport的parkNanos()方法或者parkUntil()方法。在定时等待状态中,线程不会主动执行任何代码,等待时间到达后将被唤醒。下面是一个使用sleep()方法的示例代码:
  • public class MyThread extends Thread {
    public void run() {
    try {
    System.out.println("Thread sleeping...");
    Thread.sleep(2000);
    System.out.println("Thread woke up.");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
    }
    }

    登录后复制

    在上述代码中,线程通过调用sleep()方法进入定时等待状态,并等待2秒后被唤醒。

  • 终止(TERMINATED)状态:线程执行完run()方法中的代码后,线程将进入终止状态。在终止状态中,线程将不再运行。
  • 综上所述,线程的状态对于程序的执行有着重要的影响。了解各种状态以及其含义对于编写高效的多线程程序至关重要。

    参考资料:

    • Oracle官方文档 - Java线程状态:https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html
    • Java多线程入门教程:https://www.journaldev.com/1162/java-thread-tutorial

    以上就是深入研究Java线程的几种状态及其对程序执行的影响的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论