多线程分段处理List数据

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author: SimonHu
 * @Date: 2020/10/24 15:44
 * @Description:
 */
public class RunThread {
    static private ThreadPoolTaskExecutor taskExecutor;
    static private ThreadPoolExecutor taskExecutor2;

    public RunThread(Integer corePoolSize, Integer maxPoolSize) {
        taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.initialize();
        taskExecutor.setCorePoolSize(corePoolSize);
        taskExecutor.setMaxPoolSize(maxPoolSize);
        taskExecutor.setKeepAliveSeconds(2);
        taskExecutor.setQueueCapacity(50);
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    }

    /**
     * @param list   需要处理的list
     * @param sunSum 将集合切分的段数
     * @throws InterruptedException
     * @throws ExecutionException
     */
    @SuppressWarnings("unused")
    private void doReadList(List list, int sunSum) throws InterruptedException, ExecutionException, ExecutionException {
        /**初始化集合**/
        /**接收集合各段的 执行的返回结果**/
        List> futureList = new ArrayList>();
        /**集合总条数**/
        int size = list.size();
        /**将集合切分的段数**/
        //int sunSum = 10;
        int listStart, listEnd;
        /***当总条数不足10条时 用总条数 当做线程切分值**/
        if (sunSum > size) {
            sunSum = size;
        }
        /**定义子线程**/
        SunCallable sunCallable = null;
        /**将list 切分10份 多线程执行**/
        for (int i = 0; i < sunSum; i++) {
            /***计算切割  开始和结束**/
            listStart = size / sunSum * i;
            listEnd = size / sunSum * (i + 1);
            /**最后一段线程会 出现与其他线程不等的情况**/
            if (i == sunSum - 1) {
                listEnd = size;
            }
            /**线程切断**/
            List sunList = list.subList(listStart, listEnd);
            /**子线程初始化**/
            sunCallable = new SunCallable(i, sunList);
            /***多线程执行***/
            futureList.add(taskExecutor.submit(sunCallable));
        }
        /**对各个线程段结果进行解析**/
        for (Future future : futureList) {
            if (null != future) {
                System.err.println("成功" + future.get());
            } else {
                System.err.println("失败");
            }
        }
    }

    /**
     * 测试方法
     */
    public static void main(String[] args) {
        List list = new ArrayList();
        for (int i = 0; i < 123; i++) {
            list.add("test--" + i);
        }
        long start = System.currentTimeMillis();
        RunThread runThread = new RunThread(8, 8);
        try {
            runThread.doReadList(list, 8);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //关闭线程池
        taskExecutor.shutdown();
//        taskExecutor2.shutdown();
//        taskExecutor2.shutdownNow();
//        taskExecutor2.awaitTermination(60);
        System.out.println("执行程序用时:" + (System.currentTimeMillis() - start));
    }
}

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

/**
 * @Author: SimonHu
 * @Date: 2020/10/24 15:43
 * @Description:
 */
public class SunCallable implements Callable {
    /**
     * 当前是属于第几段线程
     **/
    private int pageIndex;
    private List list;

    public SunCallable(int pageIndex, List list) {
        this.pageIndex = pageIndex;
        this.list = list;
    }

    @Override
    public Object call() throws Exception {
        System.err.println(String.format("pageIndex:%s size:%s", pageIndex, list.size()));
        Boolean result = Boolean.TRUE;
        if (null != list && list.size() > 0) {
            for (Object str : list) {
                try {
                    System.out.println(pageIndex + "::::" + str);
                    //调用业务方法
                    handleStr(str);
                } catch (Exception e) {
                    result = Boolean.FALSE;
                }
            }
        }
        Map paramMap = new HashMap(16);
        paramMap.put("code", "000");
        paramMap.put("msg", "成功");
        paramMap.put("result", result);
        return paramMap;
    }

    /**
     * 业务处理
     *
     * @param str
     * @throws InterruptedException
     */
    public void handleStr(Object str) throws InterruptedException {
//        Thread.sleep(1000);
    }
}

Original: https://www.cnblogs.com/SimonHu1993/p/14512998.html
Author: SimonHu1993
Title: 多线程分段处理List数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541774/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 保姆教程系列二、Nacos实现注册中心

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 上篇我们介绍到 保姆教程系列一、Linux搭建Nacos 注册中心原理 一、环境准备 Java版本:1.8+ (L…

    Java 2023年6月5日
    0103
  • Hibernate 离线对象构建通用查询

    1.业务场景 当下主系统衍生子业务系统已经成为常态,像京东的物流和金融,阿里的支付宝和淘宝。 子业务系统需要对主系统的资源进行访问,这里的资源我具体化为数据库数据,但日常业务中可能…

    Java 2023年5月29日
    070
  • 设计模式之代理模式(Proxy Pattern)

    1.1、介绍 代理模式(Proxy Pattern)给某一个对象提供一个代理,并由代理对象控制原对象的引用。代理对象在客户端和目标对象之间起到中介作用 。 代理模式是常用的结构型设…

    Java 2023年6月7日
    077
  • 唯一主键方案之数据库维护区间分配

    我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。 使用这种方式首先在数据库中创建 sequence 表,其…

    Java 2023年6月7日
    071
  • Spring Cloud Alibaba 使用Gateway作为服务网关

    从没有网关的角度来看后台如有N个服务,那么前端则需要对接N个服务;只要后台修改IP或者端口等任何信息那么前端也需要修改。当服务对接了网关后前端只需要统一调用网关入口即可,具体调用那…

    Java 2023年6月5日
    092
  • springboot中使用mybatisplus自带插件实现分页

    springboot中使用mybatisplus自带插件实现分页 1.导入mybatisplus分页依赖 <dependency> <groupid>com…

    Java 2023年6月15日
    085
  • SpringCloud(三).Hystrix熔断器

    一.服务器雪崩效应 在SpringCloud中存在多个微服务的调用情况,当服务的提供者不可用时,多次调用失败可能会导致服务调用者的不可用,逐渐扩展到整个系统不可用,这种情况称为服务…

    Java 2023年6月7日
    069
  • 【莫傷曉_开发笔记】linux java绘图字体乱码问题

    如题,引起这个问题的主要原因是因为现在一般的云服务器(Linux)的字体库只有默认的英文字体,但是Java绘图时常常要添加一些例如宋体,黑体,微软雅黑之类的字体,字体库中找不到相应…

    Java 2023年6月15日
    060
  • JAVA中使用JSch库实现SSH功能

    一、简介 JSch库可以实现Java连接Linux服务器并操作命令、文件等,支持常用的各种授权模式。网址:http://www.jcraft.com/jsch/ 类似C#中的SSH…

    Java 2023年5月29日
    081
  • markdown mermaid流程图

    流程图 所有流程图都由节点、几何图像、箭头或线条组成。 mermaid代码定义了这些节点和边的制作和交互方式。可以有不同的箭头类型、多向箭头以及与子图的连接。 flowchart …

    Java 2023年6月5日
    074
  • Springboot限流工具之sentinel单机限流场景无控制台

    1. sentinel简介 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。…

    Java 2023年5月30日
    067
  • 好书推荐之《Java 核心技术:卷 1 基础知识》

    大佬推荐 《 Java 核心技术:卷 1 基础知识》,这本书本来是 Sun 公司的官方用书,是一本 Java 的入门参考书。对于 Java 初学者来说,是一本非常不错的值得时常翻阅…

    Java 2023年6月15日
    069
  • 【一知半解】零值拷贝

    传统IO 应用调用read方法向操作系统发起读数据的请求,此时由 用户态切换为 内核态 当系统收到读数据请求时,利用DMA控制器把数据从磁盘读取到系统缓存区中(图中2.1) 再然后…

    Java 2023年6月9日
    086
  • 关于Springboot配置多数据源,这篇笔记太详细了!

    关于springboot配置多数据源,整理了这篇笔记,分享给有需要的小伙伴们,视频看的动力节点王鹤老师讲的springboot 目录结构 1. DataSourceConfigur…

    Java 2023年6月7日
    076
  • 线程池底层原理详解与源码分析(补充部分—ScheduledThreadPoolExecutor类分析)

    【1】前言 【2】ScheduledThreadPoolExecutor的介绍 1.ScheduledThreadPoolExecutor 继承自ThreadPoolExecuto…

    Java 2023年6月16日
    053
  • Java 访问修饰符

    访问修饰符 访问修饰符是用于控制 类、成员方法、属性 的被访问权限。 Java为我们提供了四种服务修饰符,分别是 public、 protected、 default、 priva…

    Java 2023年6月5日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球