Java基础教程(149)多线程之使用线程池:解锁Java高并发性能,线程池深度实战指南

为什么需要线程池?

在并发编程中,频繁创建和销毁线程会消耗大量系统资源。线程池通过复用已有线程,有效控制并发数量,减少创建开销,提高响应速度,同时提供更强大的线程管理功能。

线程池核心参数解析

Java中的ThreadPoolExecutor构造函数包含7个关键参数:

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:线程空闲时间
  • unit:时间单位
  • workQueue:任务队列
  • threadFactory:线程工厂
  • handler:拒绝策略

四种拒绝策略

当任务过多时,线程池会启动拒绝策略:

  • AbortPolicy:默认策略,直接抛出异常
  • CallerRunsPolicy:用调用者线程执行任务
  • DiscardPolicy:直接丢弃任务
  • DiscardOldestPolicy:丢弃队列中最老的任务

实战代码示例

import java.util.concurrent.*;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2, // 核心线程数
                5, // 最大线程数
                60, // 空闲线程存活时间
                TimeUnit.SECONDS, // 时间单位
                new ArrayBlockingQueue<>(10), // 任务队列
                Executors.defaultThreadFactory(), // 线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
        );

        // 提交任务
        for (int i = 0; i < 15; i++) {
            final int taskId = i;
            executor.execute(() -> {
                System.out.println("执行任务:" + taskId + ",线程名:" + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

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

Executors工具类快捷创建

Java提供了Executors工具类快速创建线程池:

  • newFixedThreadPool:固定大小线程池
  • newCachedThreadPool:可缓存线程池
  • newSingleThreadExecutor:单线程线程池

总结

线程池是Java并发编程的核心组件,合理配置参数对系统性能至关重要。实际开发中应根据任务特性(CPU密集型/IO密集型)选择合适的线程池类型和参数,避免使用Executors快捷方法导致的潜在问题,推荐直接使用ThreadPool构造函数创建线程池,以获得更好的可控性和性能表现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值