0
点赞
收藏
分享

微信扫一扫

java程池状态

在 Java 中,线程池的状态是由 java.util.concurrent.ThreadPoolExecutor 类管理的。ThreadPoolExecutorExecutorService 的一个实现,提供了对线程池的详细控制。线程池的状态可以通过 getPoolSizegetActiveCountgetTaskCountgetCompletedTaskCount 等方法来获取。

线程池的状态属性

  1. getPoolSize
  • 返回线程池中的当前线程数。
  1. getActiveCount
  • 返回线程池中当前正在执行任务的线程数。
  1. getTaskCount
  • 返回线程池启动以来已经执行的任务总数,包括已提交但尚未开始执行的任务。
  1. getCompletedTaskCount
  • 返回线程池已经完成的任务数。
  1. getLargestPoolSize
  • 返回线程池曾经达到的最大线程数。
  1. getQueue
  • 返回线程池的任务队列,包含已提交但尚未开始执行的任务。

示例代码

以下是一个示例,展示了如何创建一个线程池并获取其状态信息:

import java.util.concurrent.*;

public class ThreadPoolStatusExample {

    public static void main(String[] args) {
        // 创建一个固定大小的线程池
        int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 60L;
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10);
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler
        );

        // 提交一些任务
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executor.submit(() -> {
                System.out.println("Executing task " + taskId + " by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(2000); // 模拟任务执行时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // 获取线程池状态
        printThreadPoolStatus(executor);

        // 关闭线程池
        executor.shutdown();
        try {
            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
        }

        // 再次获取线程池状态
        printThreadPoolStatus(executor);
    }

    private static void printThreadPoolStatus(ThreadPoolExecutor executor) {
        System.out.println("------ ThreadPool Status ------");
        System.out.println("Pool Size: " + executor.getPoolSize());
        System.out.println("Active Threads: " + executor.getActiveCount());
        System.out.println("Number of Tasks Completed: " + executor.getCompletedTaskCount());
        System.out.println("Total Tasks: " + executor.getTaskCount());
        System.out.println("Largest Pool Size: " + executor.getLargestPoolSize());
        System.out.println("Core Pool Size: " + executor.getCorePoolSize());
        System.out.println("Maximum Pool Size: " + executor.getMaximumPoolSize());
        System.out.println("Queue Size: " + executor.getQueue().size());
        System.out.println("-----------------------------");
    }
}

代码解释

  1. 创建线程池
  • 使用 ThreadPoolExecutor 构造函数创建一个固定大小的线程池。
  • 参数包括核心线程数、最大线程数、线程空闲时间、时间单位、任务队列、线程工厂和拒绝策略。
  1. 提交任务
  • 使用 executor.submit 方法提交多个任务到线程池。
  1. 获取线程池状态
  • 调用 printThreadPoolStatus 方法打印线程池的各种状态信息。
  1. 关闭线程池
  • 使用 executor.shutdown 方法平滑关闭线程池,等待所有已提交的任务完成。
  • 使用 executor.awaitTermination 方法等待线程池中的所有任务完成,超时后强制关闭线程池。
  1. 打印线程池状态
  • printThreadPoolStatus 方法打印线程池的各种状态信息,包括线程数、活动线程数、已完成任务数、总任务数、最大线程数、核心线程数、任务队列大小等。

通过这些方法,可以全面了解线程池的当前状态,从而更好地管理和优化线程池的性能。

举报

相关推荐

0 条评论