为了速率创建线程池,启动核心线程

直接上代码

public static final int NUMBER_8 = 8; 
private static final long KEEP_ALIVETIME = 600;

 @Override
    public void downCusAllInfo(String username,String Token,String orgid) throws InterruptedException {

        // 创建线程池
        int corePoolSize = NUMBER_8;
        //corePoolSize:
//线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。
//在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动,
调用了prestartCoreThread/prestartAllCoreThreads事先启动核心线程,再考虑keepAliveTime
        int maximumPoolSize = NUMBER_8;
        //maximumPoolSize:
//线程池中允许的最大线程数,线程池中的当前线程数目不会超过该值。如果队列中任务已满,并且当前线程个数小于maximumPoolSize,那么会创建新的线程来执行任务。
//largestPoolSize:该变量记录了线程池在整个生命周期中曾经出现的最大线程个数。线程池创建之后,可以调用setMaximumPoolSize()改变运行的最大线程的数目。
        long keepAliveTime = KEEP_ALIVETIME;
        //keepAliveTime的单位是纳秒,1s=1000000000ns,1秒等于10亿纳秒。
        //keepAliveTime是线程池中空闲线程等待工作的超时时间。
        //当线程池中线程数量大于corePoolSize(核心线程数量)或设置了allowCoreThreadTimeOut(是否允许空闲核心线程超时)时,
        // 线程会根据keepAliveTime的值进行活性检查,一旦超时便销毁线程。否则,线程会永远等待新的工作。
        TimeUnit unit = TimeUnit.SECONDS;

        //常用的有界队列为 ArrayBlockingQueue,也可能是限定了范围的其他队列,创建方式如下:
        BlockingQueue<Runnable> workQueue1 = new ArrayBlockingQueue<>(50000);
        //也可能是限定了范围的其他队列,如
        BlockingQueue<Runnable> workQueue2 = new LinkedBlockingQueue<>(50000);

        //常用的无界队列为没有预定容量的 LinkedBlockingQueue,创建方式如下:
        //优点:由于没有边界限制,缓冲队列能够存储更多的任务,可以平滑顺时大量请求。
        //劣势:
        //由于没有限制队列大小,其所占用的内存空间不可预知,有内存溢出的风险
        //同时当任务平均提交速度大于平均处理速度时,有队列无限增长的风险
        //由于队列无限增长,不会触发拒绝策略
        //结论:在处理大量并发时,无界队列效果优于有界队列
        //这里使用的无界队列
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
        ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
        executor.prestartAllCoreThreads(); // 预启动所有核心线程

        List<String> querycus = customerDao.querycuss(orgid);
        System.out.println(JSON.toJSONString(querycus));
        logger.info("档案条数:" + querycus.size());
        for (int a = 0; a < querycus.size(); a++) {
            String sfzh = querycus.get(a);
            executor.execute(() -> {
                try {
                    //循环调用downCusInfoOnes方法
                    downCusInfoOnes(username,sfzh,Token);
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.info("档案详情下载失败:" + sfzh);
                }
            });
        }
        //关闭线程池
        executor.shutdown();
        while (true) {
            if (executor.isTerminated()) {
                System.out.println("线程结束");
                break;
            }
            Thread.sleep(SLEEP);
        }
    }

在配置Spring Boot线程池时,合理配置核心参数是非常重要的。以下是一些建议: 1. 核心线程数(corePoolSize):核心线程数是线程池中同时执行任务的最小线程数。根据应用程序的负载和资源限制,可以根据需求进行调整。通常,它应该设置为能够处理正常负载的数量,以避免过多的线程创建和销毁开销。如果你的应用程序是CPU密集型任务,可以设置为CPU核心数的两倍左右。 2. 最大线程数(maxPoolSize):最大线程数是线程池中允许存在的最大线程数。如果任务量超过了核心线程数,线程池创建新的线程来执行任务,直到达到最大线程数。根据系统负载和资源限制,可以根据需求进行调整。一般情况下,最大线程数应该根据系统资源限制来设置,以避免过多的线程造成系统资源耗尽。 3. 队列容量(queueCapacity):队列容量是用于存放等待执行任务的队列大小。当所有核心线程都在执行任务并且队列已满时,新任务会被拒绝执行。根据应用程序的需求和系统资源限制,可以根据需求进行调整。如果任务的到达速率很高,可以考虑使用无界队列(如`LinkedBlockingQueue`),以避免任务被拒绝执行。 4. 线程存活时间(keepAliveTime):线程存活时间是非核心线程的空闲时间,超过该时间将被终止。这个参数主要适用于非核心线程,因为核心线程始终保持活动状态。根据应用程序的负载和响应时间要求,可以根据需求进行调整。 请注意,以上参数的合理配置取决于你的应用程序需求、系统资源和预期的性能表现。通过监控和测试,可以进行适当的调整和优化。 希望这些信息对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值