项目中用到的线程池

本文介绍了一个具体的线程池配置案例,包括核心线程数、最大线程数等参数设定,并详细展示了如何利用线程池进行任务调度与执行的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private static Log logger = LogFactory.get();
    // 核心线程数
    private static final int corePoolSize = 1;
    // 最大线程数
    private static final int maximumPoolSize = 200;
    // 线程空闲时间
    private static final int keepAliveTime = 200;
    private static final int capacity = 1;

    /**
     * 处理线程池
     * @Title
     * @Description
     * @Date 16:51 2019/10/9
     * @Param (核心线程数,最大线程数,线程空闲时间,时间单位 默认为秒,数组阻塞队列)

     *
     * @return
     **/
    /**
     * 阻塞队列
     * 数组阻塞队列(ArrayBlockingQueue) :底层基于数组的有界阻塞队列,初始化时需要指定队列大小;
     * 链表阻塞队列(LinkedBlockingQueue) :以链表来存储元素,理论上只要存储空间够大,就是无界的;
     * 同步阻塞队列(SynchronousQueue):队列中不存储元素,队列中放入元素后,只有该元素被消费完成,才能重修放入元素;
     * 优先级无界阻塞队列(PriorityBlockingQueue):底层基于数组的无界队列,支持队列内部按照指定元素排序;
     * 链表阻塞双端队列(LinkedBlockingDeque):底层基于链表的有界双端阻塞队列;
     * 延迟无界阻塞队列(DelayQueue):底层是基于数组的无界延迟队列,它是在PriorityQueue基础上实现的,先按延迟优先级排序,延迟时间短的排在队列前面;
     * 链表阻塞队列与同步阻塞队列结合(LinkedTransferQueue):基于链表的无界阻塞队列;
     */
    /**
     * 拒绝策略
     * AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行
     * CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大
     * DiscardPolicy - 直接丢弃,其他啥都没有
     * DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入
     */

    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<>(capacity));


    public static void main(String[] args) {
        TaskConfig task = parseConfig("task", TaskConfig.class);
        List<SourceConfig> sourceConfigs = parseConfigs("source",SourceConfig.class);
        List<PluginConfig> pluginConfigs = parseConfigs("plugin", PluginConfig.class);

        if(task==null){
            logger.error("任务配置为空!");
            return;
        }

        logger.info("任务配置信息初始化!{}", JSON.toJSONString(task));
        logger.info("数据源信息初始化!{}", JSON.toJSONString(sourceConfigs));
        logger.info("插件信息初始化!{}", JSON.toJSONString(pluginConfigs));

        logger.info("{}处理程序开始执行!",task.getName());
        while (true){

            List<TaskEntity> taskList = new ArrayList<>();
            try{
                Map<String,String> taskMap = JedisClusterUtil.hgetAll(task.getRedis_key());
                if(taskMap!=null&&taskMap.size()>0){
                    taskMap.values().forEach(taskStr-> taskList.add(JSONObject.parseObject(taskStr, TaskEntity.class)));
                    taskList.sort(Comparator.comparing(TaskEntity::getLevel).thenComparing(TaskEntity::getOption_date).reversed());

                    for (int i = 0; i < taskList.size(); i++) {
                        TaskEntity taskBean = taskList.get(i);
                        if(taskBean.getStatus()==0){
                            DataProcessRunnable thread = new DataProcessRunnable(taskBean,task,sourceConfigs,pluginConfigs);
                            while (true){
                                System.out.println("当前活跃线程数:"+executor.getActiveCount());
                                // 当前线程数是否小于核心线程数
                                if(executor.getActiveCount()<corePoolSize){
                                    executor.execute(thread);
                                    break;
                                }else{
                                    logger.info("当前线程数已满!休眠10s后重试!");
                                    Thread.sleep(10000);
                                }
                            }
                        }
                    }
                }else{
                    logger.info("本次处理任务列表为空!");
                }
            }catch (Exception e){
                e.getMessage();
                try {
                    logger.error("任务发布异常!休眠10s后重试",e);
                    Thread.sleep(10000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值