首页 > 编程语言 >JAVA线程池-工具类

JAVA线程池-工具类

时间:2023-01-03 23:02:53浏览次数:50  
标签:taskList JAVA java poolSize util 线程 import 工具 consumer

package com.javacode2022.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;

import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author:lijinhao
 * @date:2022/8/31 21:38
 * @useful:
 * @modify
 * ===================================================
 *  modifier            modifytime                description
 * ===================================================
 */
@Slf4j
public class TaskDisposeUtils {
    public static final int POOL_SIZE;

    static {
        POOL_SIZE = Integer.max(Runtime.getRuntime().availableProcessors(), 5);
    }

    /**
     * @author:lijinhao
     * @date:2022/8/31 22:19
     * @method:dispose: 并行处理,并等待结束
     * @param taskList 任务列表
     * @param consumer 消费者
     * @class:com.javacode2022.util.TaskDisposeUtils
     * @return:void
     */
    public static <T> void dispose(List<T> taskList, Consumer<T> consumer) throws InterruptedException {
        dispose(true, POOL_SIZE, taskList, consumer);
    }

    /**
     * @author:lijinhao
     * @date:2022/8/31 22:05
     * @method:dispose: 并行处理,并等待结束
     * @param moreThread 是否多线程执行
     * @param poolSize  线程池大小
     * @param taskList 任务列表
     * @param consumer 消费者
     * @class:com.javacode2022.util.TaskDisposeUtils
     * @return:void
     */
    public static <T> void dispose(boolean moreThread, int poolSize, List<T> taskList, Consumer<T> consumer) throws InterruptedException {
        log.info("参数信息:moreThread = {},poolSize = {},taskList = {},consumer = {}", moreThread, poolSize, taskList,
                consumer);
        if (CollectionUtils.isEmpty(taskList)) {
            return;
        }
        if (moreThread && poolSize > 1) {
            poolSize = Math.min(poolSize, taskList.size());
            ExecutorService executorService = null;
            try {
                executorService = Executors.newFixedThreadPool(poolSize);

                CountDownLatch countDownLatch = new CountDownLatch(taskList.size());
                for (T item : taskList
                ) {
                    executorService.execute(() -> {
                        try {
                            consumer.accept(item);
                        } finally {
                            countDownLatch.countDown();
                        }
                    });
                }
                countDownLatch.await();
            } finally {
                if (executorService != null) {
                    executorService.shutdown();
                }
            }
        } else {
            for (T item : taskList
            ) {
                consumer.accept(item);
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        // 生成1-10的10个数字,放到list中,相当于10个任务
        List<Integer> list = Stream.iterate(1, a -> a + 1).limit(10).collect(Collectors.toList());

        TaskDisposeUtils.dispose(list, item -> {
            try {
                long startTime = System.currentTimeMillis();
                TimeUnit.SECONDS.sleep(item);
                long endTime = System.currentTimeMillis();
                log.info("任务【{}】执行完毕,耗时:{}", item, endTime - startTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        log.info("{}中的任务处理完毕!", list);
    }
}

标签:taskList,JAVA,java,poolSize,util,线程,import,工具,consumer
From: https://www.cnblogs.com/shanzhidian/p/17023621.html

相关文章

  • 亲测有效 Hyper V3.4.0 终端美化工具 支持win/mac
    亲测有效HyperV3.4.0终端美化工具支持win/macHyper是一款终端美化工具基于Web技术,JS/HTML/CSS,支持扩展增强,很不错!且支持win,mac 下载地址官网地址:立即前往......
  • 线程池测试类-TEST
    packagecom.javacode2022.threadpool;importlombok.extern.slf4j.Slf4j;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CountD......
  • nvm下载管理node版本工具
    1、下载地址: https://github.com/coreybutler/nvm-windows/releases2、nvm常用指令:配置nvm的镜像服务器nvmnode_mirrorhttps://npmmirror.com/mirro......
  • 主题 2 Shell工具和脚本
    主题2Shell工具和脚本Shell工具和脚本·themissingsemesterofyourcseducation(missing-semester-cn.github.io)Shell脚本shell脚本是一种更加复杂度的工具......
  • java基于springboot外卖系统在线订餐系统app源码厨艺论坛APP
    简介本项目主要包括了外卖订餐系统(在线订餐和外卖配送)、厨艺论坛系统、管理员后台、用户中心等功能。用户注册后可以选择餐桌在线点餐支付,也可以选择外卖配送到家的方式。......
  • java开发的考研系统大学生考研推荐网站考研网站源码
    简介:考研信息推荐查询。主要是管理发布管理考研的知识文章,或者上传资料,发布考研的视频。学生可以注册后下载资料,查看考研文章视频等。文章分为vip文章和普通文章,学生查看v......
  • java家装网装修网站装修系统源码
    简介本平台主要是家装网站。管理员发布装修案例,看工地,装修设计师,装修攻略,装修知识文章等,嵌入3d全景图。普通用户注册,填写装修房型报价等。演示视频:https://www.bilibil......
  • Java Platform Standard Edition 8 Documentation
    OraclehastwoproductsthatimplementJavaPlatformStandardEdition(JavaSE)8:JavaSEDevelopmentKit(JDK)8andJavaSERuntimeEnvironment(JRE)8.JDK8......
  • Java 8 中的 Streams API 详解
    filterfilter对原始Stream进行某项测试,通过测试的元素【返回true的】被留下来生成一个新Stream。清单10.留下偶数Integer[]sixNums={1,2,3,4,5,6};Integer[]......
  • 权重随机算法的java实现
    一、概述平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的。如广告投放、负载均衡等。如有4个元素A、B、C、D,权重......