首页 > 编程语言 >java程池状态

java程池状态

时间:2024-10-15 20:20:58浏览次数:9  
标签:状态 程池 java System 任务 线程 executor println out

在 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 方法打印线程池的各种状态信息,包括线程数、活动线程数、已完成任务数、总任务数、最大线程数、核心线程数、任务队列大小等。

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

标签:状态,程池,java,System,任务,线程,executor,println,out
From: https://blog.51cto.com/u_16390833/12259901

相关文章

  • 【JavaWeb】一文读懂Cookie、Session&Token 的区别和联系
    大佬精心打造:JavaWeb进阶学习资料》》点击免费获取【javaWeb】Cookie&Session&SpringSession原理分析简介Cookie、Session、Token这三者是不同发展阶段的产物,都是为了解决无状态的HTTP协议,提升网站的交互体验。但是他们各有优缺点,三者也没有明显的对立关系,反而常常......
  • 【JavaWeb】Spring Boot中@Import多种使用方式
    @Import是一个非常有用的注解,它的长处在于你可以通过配置来控制是否注入该Bean,也可以通过条件来控制注入哪些Bean到Spring容器中。比如我们熟悉的:@EnableAsync 、@EnableCaching、@EnableScheduling等等统一采用的都是借助@Import注解来实现的。  需要注意的是:ImportSele......
  • 学习java第八天
    一.方法重写/方法覆盖/Override为什么要进行方法重写/覆盖?子类不满足父类的逻辑,进行重写方法重写的注意事项:1.方法重写前提是必须要继承2.所继承的方法名必须一致,方法参数也要一致举例说明一个方法的三部分publicvoideat(){}第一部分头部 访问权限修饰符publicp......
  • java解决就简单的亮灯问题
    100个房间每个房间1盏灯   这些灯都是灭的   //123456789   100个人coming      第1个人   来到每个房间前         如果房间编号能够整除1(人的编号)         拉一下灯      第2个人   来到每......
  • Java的引擎效验报错-java.lang.VerifyError
    java包直接修改bytecode,经常会报错java.lang.VerifyError,包含非常多种的检查直接修改引擎dll文件去除效验jvm.dll-X64-V21.0.0.0.text:000000018084438F488D0DDA422100learcx,aVerifyingMetho;"Verifyingmethod%s".text:00000001......
  • 图文深入理解java对象从创建到回收都经历了什么
    1.前言:每个java对象都是有生命周期的,就像一个人的生命一样,从孕育到出生到成长变老最后由归于自然。笔者认为,Java对象的整个生命周期可以分为两个大的阶段:即创建阶段和运行阶段(包含对象的回收和消亡)。本篇将会图文深入介绍java对象的整个生命过程。一般人平时看到java其实......
  • Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
    什么是变量?在Java里,变量就是一个“可变的小盒子”,你可以随时改变它里面的数据。就像你有一个存钱罐,可以随时往里面放钱、取钱,今天装100块,明天变成200块,完全没问题。变量的定义:当你要定义一个变量时,你要告诉Java两个信息:这个“盒子”是用来装什么类型的数据(也就是数据类......
  • JAVA基础笔记1(变量与运算符+基本数据类型)
    目录一.开发工具1.快捷键常用二.HelloWorld案例:输出:心形三:变量与运算符3.1关键字3.2 标识符(identifier)3.3变量3.30变量的概念:3.31变量类型3.32引用数据类型:   类:class   数组:array   接口:interface   枚举:enum   注解:annotation   ......
  • 【Linux】Linux进程状态与进程优先级
    1.前置知识1.1.并行与并发并发:表示CPU在同⼀个时间内执⾏多个任务并⾏:表示多个CPU在同⼀个时间内执⾏各⾃的任务示意图如下:1.2.时间片时间⽚(timeslice),⼜称为“量⼦(quantum)”或“处理器⽚(processorslice)”,是分时操作系统分配给每个正在运⾏的进程微观上的⼀段CPU时间(在......
  • Java毕业设计 基于SpringBoot和Vue游戏商城网站
    Java毕业设计基于SpringBoot和Vue游戏商城网站这篇博文将介绍一个基于SpringBoot框架和Vue开发的游戏商城网站,适合用于Java毕业设计。功能介绍首页图片轮播游戏推荐游戏分类游戏详情添加购物车立即购买积分兑换评论收藏游戏论坛发布帖子游戏资讯......