java线程池使用实践

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                //核心数 当前cpu核心数+1
                Runtime.getRuntime().availableProcessors() + 1,
                //最大核心数 当前cpu核心数+1
                Runtime.getRuntime().availableProcessors() + 1,
                //时间60
                60L,
                //单位 秒
                TimeUnit.SECONDS,
                //阻塞对列数 1
                new LinkedBlockingDeque<>(1),
                //默认工厂
                Executors.defaultThreadFactory(),
                //放弃策略 哪来的回哪去
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
public class FileHandleExecutorConfig {

    /**
     * 设置线程池信息
     */
    public static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(2, 4,
            200,
            TimeUnit.MILLISECONDS,
            new LinkedBlockingDeque<>(50),
            new ThreadPoolExecutor.AbortPolicy());

    private FileHandleExecutorConfig() {
    }
}


//调用

FileHandleExecutorConfig.EXECUTOR.execute(() -> {

            try {
                obsClient.putObject(bucket, objectKey, stream);
                //通过回调函数更新数据状态
                updateDataByCallBack(obsUploadParam.getCacheCode(), uploadToObsCallBackService, "2");
            } catch (Exception e) {
                log.error("文件上传obs失败,原因:{}", e.getMessage());
                //通过回调函数更新数据状态
                updateDataByCallBack(obsUploadParam.getCacheCode(), uploadToObsCallBackService, "3");
            }
        });

构造函数的参数含义如下:

corePoolSize:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;

maximumPoolSize:指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;

keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;

unit:keepAliveTime的单位

workQueue:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;

threadFactory:线程工厂,用于创建线程,一般用默认即可;

handler:拒绝策略;当任务太多来不及处理时,如何拒绝任务;

推荐更为详细的文章:

https://www.cnblogs.com/dafanjoy/p/9729358.html

### Java 线程池最佳实践 #### 使用自定义线程池而非默认实现 Web 服务器如 Tomcat 提高并发处理能力的方式之一就是利用线程池技术。Tomcat 并不是简单地依赖于标准库提供的基础功能,而是进一步优化并定制化了这些组件以满足特定需求[^1]。 #### 正确处理未捕获异常 当创建新线程时,应该设置 `setUncaughtExceptionHandler` 来确保即使是在子线程内部发生的错误也能被记录下来。如果不这样做,则可能出现某些类型的运行时异常(例如除数为零的情况)完全不被察觉的问题。下面是一个例子展示了如何正确配置异常处理器: ```java thread.setUncaughtExceptionHandler((t, e) -> { e.printStackTrace(); }); ``` 如果忽略了上述代码片段中的异常打印逻辑,那么一旦发生类似 `/ by zero` 的算术运算错误,应用程序将不会显示出任何明显的提示信息[^3]。 #### 谨慎对待 Executors 工具类 虽然使用 `Executors.newFixedThreadPool()` 或其他静态工厂方法可以快速简便地获取到一个预设参数的线程池实例,但这并不是推荐的做法。因为这种方式隐藏了许多重要的细节,默认情况下可能会导致内存泄漏或者其他性能瓶颈问题。相反,建议总是显式调用 `ThreadPoolExecutor` 构造器来自行指定核心大小、最大容量以及队列策略等重要属性,从而更好地控制资源分配和管理行为模式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值