简单谈谈Java 中的线程的几种状态

当Java程序启动时,JVM会为主线程分配一个特殊的栈来执行代码。同时,程序可以创建若干个子线程以支持并发执行相应的任务。线程在执行过程中,可以出现以下几种状态:

新建状态(New)

当线程对象创建以后,该线程处于新建状态。此时线程对象已经在内存中了,但是还没有分配系统资源,没有被CPU选中去执行,也没有开始执行线程中的代码。因此,新建状态的线程在内存中的状态是一片混沌。

代码示例

public class NewThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread();
        System.out.println("New Thread's State: " + thread.getState());
    }
}

就绪状态(Runnable)

在获得了CPU时间片之后,线程开始执行,此时线程进入就绪状态。在线程进入就绪状态后,它就有机会获得系统的CPU时间片,占用CPU资源执行代码。

代码示例

public class ReadyThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName() + " running");
                }
            }
        });
        System.out.println("Thread's State: " + thread.getState());
        thread.start();
        System.out.println("Thread's State: " + thread.getState());
    }
}

在上述示例中,“Thread's State: RUNNABLE”代表线程已经被启动,进入就绪状态。由于线程是并发执行的,因此,运行结果是不确定的。

运行状态(Running)

当就绪状态的线程获得CPU时间片,开始执行run()方法(或者是重新执行run()方法)之后,线程进入运行状态。此时,线程会执行它的任务代码。

代码示例

public class RunningThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName() + " running");
                }
            }
        });
        System.out.println("Thread's State: " + thread.getState());
        thread.start();
        while (thread.getState() != Thread.State.TERMINATED) {
            System.out.println("Thread's State: " + thread.getState());
        }
        System.out.println("Thread's State: " + thread.getState());
    }
}

在上述示例中,“Thread's State: RUNNING”代表线程正在运行。为了让线程运行一定的时间,我们使用了while循环来输出线程的状态,直到线程运行结束(TERMINATED)。

阻塞状态(Blocked)

线程在执行过程中,可能因为某些原因,比如等待输入输出、等待某个锁、休眠等,使CPU无法继续执行该线程。此时,线程就从运行状态进入了阻塞状态,等待相应的条件被满足后重新进入就绪状态以等待获取资源继续执行。

代码示例

public class BlockedThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        final Object lock = new Object();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + " acquired lock");
                    try {
                        System.out.println(Thread.currentThread().getName() + " waiting for lock...");
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " released lock");
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + " acquired lock");
                    try {
                        TimeUnit.SECONDS.sleep(3);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.notify();
                    System.out.println(Thread.currentThread().getName() + " sent signal");
                }
                System.out.println(Thread.currentThread().getName() + " released lock");
            }
        });
        thread1.start();
        thread2.start();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Thread 1 State: " + thread1.getState());
        System.out.println("Thread 2 State: " + thread2.getState());
        TimeUnit.SECONDS.sleep(3);
        System.out.println("Thread 1 State: " + thread1.getState());
        System.out.println("Thread 2 State: " + thread2.getState());
    }
}

在上述示例中,线程thread1试图获得一个锁,但是该锁被线程thread2占用,因此,线程thread1将进入阻塞状态,等待线程thread2释放锁并发送信号唤醒它。

终止状态(Terminated)

线程执行完自己的任务后,自动结束执行,进入终止状态。此时,线程释放占用的资源,例如对象锁、IO资源等。终止状态的线程不可再次调用start()方法。

代码示例

public class TerminatedThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName() + " running");
                }
            }
        });
        System.out.println("Thread's State: " + thread.getState());
        thread.start();
        TimeUnit.SECONDS.sleep(3);
        System.out.println("Thread's State: " + thread.getState());
    }
}

在上述示例中,在线程执行完自己的任务之后,线程进入终止状态。由于终止状态的线程不可再次调用start()方法,因此,运行结果如下:

Thread's State: NEW
Thread's State: RUNNABLE
Thread-0 running
Thread-0 running
Thread-0 running
Thread-0 running
Thread-0 running
Thread's State: TERMINATED

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单谈谈Java 中的线程的几种状态 - Python技术站

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

相关文章

  • Java并发编程信号量Semapher

    Java并发编程信号量Semapher攻略 在Java并发编程中,信号量(Semaphore)是一种用于控制并发线程数量的工具,大多用于控制对共享资源的访问,通过信号量的控制,可以实现线程之间的协作与资源控制。 信号量(Semaphore)的概念及使用方法 信号量(Semaphore)是一个经典的多线程同步控制工具,它用于控制同时访问某个资源的线程数量,通过…

    多线程 2023年5月16日
    00
  • Java多线程之多线程异常捕捉

    下面是Java多线程异常捕捉的完整攻略: 1. 前言 在多线程编程中,线程之间的执行是异步的,每个线程都是独立的运行体,因此线程之间互不干扰。但也正是由于线程之间互不干扰,因此某些线程可能会因为执行出现异常而导致程序运行出错。 为了避免这种情况的发生,我们需要对多线程中的异常进行捕捉和处理。 2. 异常的传递 多线程中的异常是无法通过try-catch捕捉的…

    多线程 2023年5月17日
    00
  • 【java 多线程】守护线程与非守护线程的详解

    Java多线程:守护线程与非守护线程的详解 什么是守护线程? 在Java多线程中,守护线程是一种在后台运行的线程,它不会阻止程序的结束,也不会执行任何没有被其他非守护线程阻止的操作。 换句话说,当程序中最后一个非守护线程结束时,JVM会强制退出来,即使守护线程还在运行。 如何创建守护线程? 可以通过Thread类的setDaemon()方法来创建守护线程,示…

    多线程 2023年5月17日
    00
  • ThinkPad T470商务本值得买吗?ThinkPad T470全面图解评测及拆解

    ThinkPad T470商务本值得买吗? 如果你正在寻找一款强大的商务笔记本电脑并且预算充足,那么ThinkPad T470绝对是一个不错的选择。它具有出色的性能、超长的电池续航和坚固的外壳,非常适合商务用户。 ThinkPad T470的优点 第七代英特尔酷睿处理器和快速的SSD硬盘,大大提高了工作效率; 机身坚固,通过了12种军事级别的测试,可以适应各…

    多线程 2023年5月17日
    00
  • Python mutiprocessing多线程池pool操作示例

    Python multiprocessing 库为用户提供了一种方便的方式来实现多进程并发编程,其中线程池代表着一种线程管理方式,使用线程池可以避免因过多的线程导致系统崩溃的问题。下面是完整的实现攻略和两条示例说明。 创建线程池 使用 Python 中 multiprocessing 库中的 Pool 类来创建线程池。下面是一个示例代码: from mult…

    多线程 2023年5月17日
    00
  • 创建并运行一个java线程方法介绍

    让我们来详细讲解一下”创建并运行一个Java线程”的完整攻略。 一、什么是Java线程 Java线程是指在Java应用程序内部独立运行的一段子代码,它通过一个线程执行器(通常是Java虚拟机)来实现独立运行和交互式方法调用。 二、创建线程的三种方式 方式一:继承Thread类 创建线程的第一种方式是继承Thread类,重写它的run()方法,然后通过调用st…

    多线程 2023年5月16日
    00
  • MySQL高并发生成唯一订单号的方法实现

    当MySQL数据库面对高并发情况下生成唯一订单号时,我们可以采用以下方法实现: 方案一:使用UUID UUID是一个用于标识信息的128位字长的数字。在常见的实现中,总共有36个字符,其中有32个16进制字符,以及4个连接号。生成UUID可以使用MySQL提供的UUID()函数。在插入订单数据时,可以在SQL语句中调用UUID()函数,确保每个订单都有唯一的…

    多线程 2023年5月17日
    00
  • Java多线程与线程池技术分享

    Java多线程与线程池技术分享 1. 多线程 什么是线程? 线程是一个程序执行流的最小单元,一个程序至少有一个执行流,即主线程。主线程在JVM启动时就存在了。 创建线程的方式 继承Thread类 重写Thread类的run()方法。 public class MyThread extends Thread { @Override public void ru…

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