Java——线程池

java------线程池

预先创建好一定数量线程对象,存入缓冲池,需要用的时候直接从缓冲池中取出,用完之后不要销毁,还回到缓冲池中,供下一次任务使用。

优点:

  • 提高线程的利用率
  • 提高响应速度
  • 便于统一管理线程对象
  • 可控制最大并发量

工作流程:

  • 初始化线程池,创建默认数量的线程对象
  • 当任务过多的时候,额外补充线程数量
  • 当任务趋于正常,额外补充的线程会自动销毁

线程池实现的三种方式:

!!这三种都不常用,都有自身缺点!!

1、Executors.newSingleThreadExecutor() :单例线程池,只有一个线程在干活

2、Executors.newFixedThreadPool(5):指定数量的线程池

3、Executors.newCachedThreadPool():根据电脑自身配置创建线程池

java 复制代码
public class ExecutorServiceTest {
    public static void main(String[] args) {
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
//        ExecutorService executorService = Executors.newFixedThreadPool(5);
        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            final int temp = i;
            executorService.execute(() -> {
                System.out.println(Thread.currentThread().getName() + ":" + temp);
            });
        }

        executorService.shutdown();
    }
}

ThreadPoolExecutor :线程池原生类(一般用这种方式)

核心参数:

java 复制代码
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
  • corePoolSize:核心池大小
  • maximumPoolSize:线程池最大线程数
  • keepAliveTime:空闲线程存活时间
  • unit:时间单位
  • workQueue:阻塞队列
  • threadFactory:线程工厂
  • handler:拒绝策略
    • new ThreadPoolExecutor.DiscardPolicy():直接忽略,不会报错
    • new ThreadPoolExecutor.AbortPolicy():拒绝,会报错出来
java 复制代码
public class ExecutorServiceTest {
    public static void main(String[] args) {
        ExecutorService executorService = new ThreadPoolExecutor(2, 5,
                1L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardPolicy());

        for (int i = 0; i < 9; i++) {
            final int temp = i;
            executorService.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "::" + temp);
            });
        }
        executorService.shutdown();
    }
}
相关推荐
文丑颜不良啊1 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang2 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪3 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息3 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼3 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff5 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff5 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
David猪大卫5 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
SL_staff6 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5207 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发