通过用户登录案例,详细说明线程的7种状态

参考上一篇: 线程的7种状态(NEW,RUNNABLE,Running,BLOCKED,WAITING,TINED_WATING,TEMINATE)-CSDN博客

  1. 系统启动时,线程池初始化

    • 当调用 Executors.newFixedThreadPool(2) 时,线程池会创建 2 个线程对象,这些线程对象处于 新建(New) 状态。
  2. 用户登录时,线程获取登录数据并访问登录接口

    • 当调用 threadPool.submit() 方法时,线程池会从空闲线程中选择一个线程来执行任务。此时,被选中的线程进入 就绪(Runnable) 状态,等待系统调度执行。
    • 当系统为该线程分配 CPU 时间片后,线程进入 运行(Running) 状态,开始执行 UserLoginService.login() 方法中的代码。
  3. 查询数据库时

    • 当线程执行 DriverManager.getConnection() 方法时,需要等待数据库连接建立,此时线程进入 阻塞(Blocked) 状态。
    • 当数据库连接建立成功后,线程继续执行 SQL 查询语句,仍然处于 阻塞(Blocked) 状态,直到查询结果返回。
  4. 线程执行完毕

    • 当 UserLoginService.login() 方法执行完毕后,线程的任务完成,进入 终止(Terminated) 状态。

通过以上示例,你可以清楚地看到线程在不同阶段的生命周期转换。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 模拟用户登录服务
class UserLoginService {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/testdb";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "password";

    public void login(String username, String password) {
        // 模拟线程进入运行状态
        System.out.println(Thread.currentThread().getName() + " 开始处理登录请求,当前状态: 运行");
        try {
            // 模拟查询数据库,线程进入阻塞状态
            System.out.println(Thread.currentThread().getName() + " 开始查询数据库,当前状态: 阻塞");
            try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
                 PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?")) {
                stmt.setString(1, username);
                stmt.setString(2, password);
                try (ResultSet rs = stmt.executeQuery()) {
                    if (rs.next()) {
                        System.out.println(Thread.currentThread().getName() + " 登录成功");
                    } else {
                        System.out.println(Thread.currentThread().getName() + " 登录失败");
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        // 线程执行完毕,进入终止状态
        System.out.println(Thread.currentThread().getName() + " 登录处理完成,当前状态: 终止");
    }
}

public class ThreadLifecycleExample {
    public static void main(String[] args) {
        // 系统启动时,线程池初始化,线程被创建,处于新建状态
        System.out.println("系统启动,初始化线程池");
        ExecutorService threadPool = Executors.newFixedThreadPool(2);
        System.out.println("线程池初始化完成,线程处于新建状态");

        // 用户登录时,从线程池获取线程,线程进入就绪状态
        String username = "testuser";
        String password = "testpassword";
        System.out.println("用户发起登录请求,从线程池获取线程,线程进入就绪状态");
        threadPool.submit(() -> {
            UserLoginService loginService = new UserLoginService();
            loginService.login(username, password);
        });

        // 关闭线程池
        threadPool.shutdown();
    }
}

  

你可能感兴趣的:(jvm,线程,线程状态)