博客
关于我
Java自定义线程池来模拟银行办理业务场景来解析ThreadPoolExecutor的七大参数和四大拒绝策略
阅读量:370 次
发布时间:2019-03-05

本文共 2317 字,大约阅读时间需要 7 分钟。

为什么选择使用 ThreadPoolExecutor 而不是 Executor?

在阿里巴巴的开发手册中,明确指出不推荐直接使用 Executors 来创建线程,而是应该使用 ThreadPoolExecutor。这种选择背后的原因有很多,但最重要的原因之一是 ThreadPoolExecutor 提供了更好的线程管理和资源利用能力。

ThreadPoolExecutor 有七大参数,你需要了解它们

在使用 ThreadPoolExecutor 时,它提供了七个关键参数,这些参数对于配置线程池的性能和行为至关重要。以下是这些参数的解释:

  • 核心线程数(corePoolSize):指定线程池的核心线程数量。核心线程用于处理正常的工作量。
  • 最大线程数(maxPoolSize):指定线程池的最大线程数量。当核心线程已满时,继续提交任务时会创建额外的线程。
  • 超时时间(timeUnit):指定线程等待的超时时间。如果线程在等待任务时超过指定时间,就会关闭线程并释放资源。
  • 候客区队列(linkedBlockingQueue):指定线程池的候客区队列大小。当核心线程忙于处理任务时,未被立即处理的任务会被放入候客区队列中等待。
  • 线程工厂(threadFactory):指定用于创建线程的工厂。默认工厂会使用系统的线程。
  • 拒绝策略(rejectionPolicy):指定线程池在遇到拒绝任务时的策略。常见策略包括抛出异常、丢弃旧任务等。
  • ThreadPoolExecutor 的拒绝策略有四种选择

    ThreadPoolExecutor 提供了四种拒绝策略,允许开发者根据具体需求选择最适合的策略:

  • 直接抛出异常:当线程池已经满员时,新提交的任务会直接抛出 RejectedExecutionException 异常。
  • 丢弃旧任务(DiscardOldestPolicy):当线程池已经满员时,会丢弃最旧的任务。
  • 丢弃新任务(DiscardNewestPolicy):当线程池已经满员时,会丢弃最新的任务。
  • 等待任务完成后丢弃(SameThreadModel):当线程池已经满员时,会等待当前线程完成任务后再丢弃新任务。
  • 如何通过 Java 实现银行办理业务场景

    在实际业务场景中,银行的业务办理可以通过 ThreadPoolExecutor 来模拟。以下是一个典型的实现示例:

    import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolExecutorDemo {    public static void main(String[] args) {        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(                2, // 最多开启2个窗口                5, // 最多同时处理的业务量                2, // 超时时间(秒)                TimeUnit.SECONDS,                new LinkedBlockingQueue<>(3), //候客区最多容纳3个客户                Executors.defaultThreadFactory(),                new ThreadPoolExecutor.DiscardOldestPolicy()        );        try {            // 最大承载能力:窗口 + 候客区            for (int i = 1; i <= 9; i++) {                threadPool.execute(() -> {                    System.out.println(Thread.currentThread().getName() + " ok");                });            }        } catch (Exception e) {            e.printStackTrace();        } finally {            threadPool.shutdown();        }    }}

    测试结果分析

    通过上述代码可以发现:

    • 当有1~5个客户同时办理业务时,只会使用前两个窗口处理业务。
    • 当有6~8个客户办理业务时,银行会开启额外的窗口来处理业务。
    • 当客户数量超过8个时,银行会采用拒绝策略(如抛出异常)。

    ThreadPoolExecutor 的七大参数解析

    ThreadPoolExecutor 的七大参数如下:

    • corePoolSize:2(最多开启2个窗口)
    • maxPoolSize:5(最多同时处理的业务量)
    • timeUnit:2(超时时间)
    • linkedBlockingQueue:3(候客区最多容纳3个客户)
    • threadFactory:默认线程工厂
    • rejectionPolicy:丢弃旧任务策略

    通过合理配置这些参数,可以实现更高效的线程管理和资源利用。

    转载地址:http://myhg.baihongyu.com/

    你可能感兴趣的文章
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    Node出错导致运行崩溃的解决方案
    查看>>
    node安装及配置之windows版
    查看>>
    Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
    查看>>
    NOIp2005 过河
    查看>>
    NOIp模拟赛二十九
    查看>>
    NOPI读取Excel
    查看>>
    NoSQL&MongoDB
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>