精华内容
下载资源
问答
  • 多线程处理List集合

    2020-06-30 11:52:30
    我会编写一个多线程方案改善你的代码。 实施方案 将集合拆分成多个子集合,数据分片 引入三方,guava <dependency> <groupId>com.google.guava</groupId> <artifactId>guava<...

    背景

      假如你的需求要处理一个很大的集合,并且处理时间希望越开越好。正常你就是启动一个方式,以单线程的方式慢慢处理。下面

      我会编写一个多线程方案改善你的代码。

    实施方案

        将集合拆分成多个子集合,数据分片

       引入三方,guava

            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
    

        示例代码

       List<List<File>> partition = Lists.partition(files, 16);

       

       一个分片集合用一个线程进行处理

           这块我只提供的是方案,代码是伪代码,正常需要用线程池,如果你这块代码不会写,可以给我评论留言你的需求,我会按

    照你的留言给你写真实的代码

      for (List<File> fileList : partition) {
    
    
        new Runnable() {
    
             public void run() {
    
                    for (File file : fileList){
    
    
    
                        }
        
                  
    
                }
    
    
         }
    
    
    
    }

     

     

     

     

    展开全文
  • 主要介绍了Java多线程处理List数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 场景:大数据List集合,... 将对比操作在多线程中实现 public static void main(String[] args) throws Exception { // 开始时间 long start = System.currentTimeMillis(); List<String> list = new Arr.

    场景:大数据List集合,需要对List集合中的数据同标准库中数据进行对比,生成新增,更新,取消数据 
    解决方案:

    1. List集合分段,
    2. 动态创建线程池newFixedThreadPool
    3. 将对比操作在多线程中实现
      public static void main(String[] args) throws Exception {
      
      	// 开始时间
      	long start = System.currentTimeMillis();
      	List<String> list = new ArrayList<String>();
      
      	for (int i = 1; i <= 3000; i++) {
      		list.add(i + "");
      	}
      
          /*动态线程数方式*/
      	// 每500条数据开启一条线程
      	int threadSize = 500;
      	// 总数据条数
      	int dataSize = list.size();
      	// 线程数,动态生成
      	int threadNum = dataSize / threadSize + 1;
      
          /*固定线程数方式
      	    // 线程数
      	    int threadNum = 6;
      	    // 总数据条数
      	    int dataSize = list.size();
      	    // 每一条线程处理多少条数据
      	    int threadSize = dataSize / (threadNum - 1);
          */
      
      	// 定义标记,过滤threadNum为整数
      	boolean special = dataSize % threadSize == 0;
      
      	// 创建一个线程池
      	ExecutorService exec = Executors.newFixedThreadPool(threadNum);
      	// 定义一个任务集合
      	List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
      	Callable<Integer> task = null;
      	List<String> cutList = null;
      
      	// 确定每条线程的数据
      	for (int i = 0; i < threadNum; i++) {
      		if (i == threadNum - 1) {
      			if (special) {
      				break;
      			}
      			cutList = list.subList(threadSize * i, dataSize);
      		} else {
      			cutList = list.subList(threadSize * i, threadSize * (i + 1));
      		}
      		
      		final List<String> listStr = cutList;
      		task = new Callable<Integer>() {
      
      			@Override
      			public Integer call() throws Exception {
      				//业务逻辑,循环处理分段后的list
      				System.out.println(Thread.currentThread().getName() + "线程:" + listStr);
      				//......
      				return 1;
      			}
      		};
      		// 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
      		tasks.add(task);
      	}
      
      	exec.invokeAll(tasks);
      
      	// 关闭线程池
      	exec.shutdown();
      	System.out.println("线程任务执行结束");
      	System.out.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
      }

      参考文章:https://www.cnblogs.com/huangdabing/p/9251598.html

    展开全文
  • 多线程分段处理List集合

    千次阅读 2017-08-29 22:07:36
    场景:大数据量List集合,...解决方案:考虑到效率问题,对List集合分段,动态创建线程池线程条数,完成数据对比操作,代码如下:public static void main(String[] args) throws Exception { // 开始时间 long start = Syst

    场景:大数据List集合,需要对List集合中的数据同标准库中数据进行对比,生成新增,更新,取消数据
    解决方案:

    1. List集合分段,
    2. 动态创建线程池newFixedThreadPool
    3. 将对比操作在多线程中实现

    代码如下:

    public static void main(String[] args) throws Exception {
            // 开始时间
            long start = System.currentTimeMillis();
            // 模拟数据List
            List<String> list = new ArrayList<String>();
            for (int i = 1; i <= 3000; i++) {
                list.add(i + "");
            }
            // 每500条数据开启一条线程
            int threadSize = 500;
            // 总数据条数
            int dataSize = list.size();
            // 线程数
            int threadNum = dataSize / threadSize + 1;
            // 定义标记,过滤threadNum为整数
            boolean special = dataSize % threadSize == 0;
            // 创建一个线程池
            ExecutorService exec = Executors.newFixedThreadPool(threadNum);
            // 定义一个任务集合
            List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
            Callable<Integer> task = null;
            List<String> cutList = null;
            // 确定每条线程的数据
            for (int i = 0; i < threadNum; i++) {
                if (i == threadNum - 1) {
                    if (special) {
                        break;
                    }
                    cutList = list.subList(threadSize * i, dataSize);
                } else {
                    cutList = list.subList(threadSize * i, threadSize * (i + 1));
                }
                // System.out.println("第" + (i + 1) + "组:" + cutList.toString());
                final List<String> listStr = cutList;
                task = new Callable<Integer>() {
                    @Override
                    public Integer call() throws Exception {
                        System.out.println(Thread.currentThread().getName() + "线程:" + listStr);
                        return 1;
                    }
                };
                // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
                tasks.add(task);
            }
            List<Future<Integer>> results = exec.invokeAll(tasks);
            for (Future<Integer> future : results) {
                System.out.println(future.get());
            }
            // 关闭线程池
            exec.shutdown();
            System.out.println("线程任务执行结束");
            System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
        }
    
    展开全文
  • 多线程处理list集合参考

    千次阅读 2019-06-25 22:10:20
  • 多线程之分段处理List集合

    千次阅读 2019-08-02 11:11:22
    一、基础 1.1Callable接口 一般线程的创建有三种方式,...而后两种可以使用Executor框架的线程池来管理线程,执行任务,可以重用存在的线程,减少对象创建、消亡的开销,提供定时执行、定期执行、单线程、并发数...
  • 针对此问题,查阅了网上很多资料,好多都使用多线程处理。跟着好多的博客进行处理,要么是线程安全问题,要么根本速度就提高不了。我针对我项目中的使用场景,结合资料进行了修改,特提交此文,为有共同需求的小...
  • java 多线程处理一个list集合

    万次阅读 2016-08-03 09:16:20
    import java.util.ArrayList;...import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent
  • java多线程的使用(处理list集合

    千次阅读 2020-08-06 17:14:39
    * 多线程处理list * * @param data 数据list * @param threadNum 线程数 */ public synchronized void handleList(List<String> data, int threadNum) { int length = data.size(); int tl = length %...
  • Springboot自定义线程池,多线程遍历list及有返回值 自定义连接池 /** * @description: 某功能公共线程池 * @author: zjq * @create: 2021-01-06 15:35 **/ @Configuration public class ...
  • Java 中List集合使用多线程分段处理

    千次阅读 2018-12-12 10:45:31
    因业务需要,需从excel读取数据并插入数据库,由于数据量较大,耗时较长,考虑使用多线程处理 1.读取到的list按数据量分段 2.动态创建线程 public class ScmcommissionLineServiceImpl{ //导入数据 public ...
  • java多线程批量处理list集合中的数据

    万次阅读 2019-05-10 17:50:10
    public class ThreadList { public static void main(String[] args) throws InterruptedException, ExecutionException ... List<String> list = new ArrayList<>(); for(int i=0;i<5300;i+...
  • 多线程处理List

    千次阅读 2019-07-16 20:09:13
    list分隔成个,给线程处理 package thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import ....
  • CompletionService将Executor(线程池)和BlockingQueue(堵塞队列)结合在一起,同一时候使用Callable作为任务的基本单元,整个过程就是生产者不断把...并返回结果,实现list集合分发多线程串行计算返回计算结果
  • 多线程处理List数据

    千次阅读 2018-11-04 17:26:35
    CountDownLatch进行多线程处理list 由于公司的一个辅算系统进行计算的时间比较长3万的数据需要5分钟才能算完这个完全超出了预算,我跟负责项目的同事交流之后发现代码的if 语句特别多导致臃肿等等。针对这些先了几点...
  • 多线程数量的问题,一般情况下,多线程数量要等于机器CPU核数-1. 实例1: 解决问题:如何让n个线程顺序遍历含有n个元素的List集合 1 import java.util.ArrayList; 2 import java.util.List; 3 import ...
  • java多线程读取、操作List集合

    千次阅读 2018-05-21 16:36:00
    /** * 固定开辟8线程 * * @Author: wpf * @Date: 16:05 2018/5/21 * @Description: * @param * @param null * @return */ private void threadExec1(List&lt;SysCompany&g...
  • 多线程list使用.zip

    2019-09-08 20:30:05
    多线程list集合的基本使用,可添加元素、遍历元素、删除元素
  • 线程处理1个List集合

    千次阅读 2014-04-03 16:38:38
    昨天发了一个提问,启动5个线程将一个List中的内容,然后将5个线程的内容拼接起来,由于时间比较急迫,自己就写了一个Demo,希望对菜鸟有参考意义。。 [code="java"] import java.util.ArrayList; ...
  • 基于Spring 的ThreadPoolTaskExecutor 线程池分段遍历读取集合list 代码如下所示:   1、定义线程池 &lt;bean id="threadPoolTaskExecutor" class="org.springframework.scheduling....
  • Java 多线程处理集合数据

    千次阅读 2018-05-03 22:22:28
    处理一个包含10万条数据的字符串集合,将其中含有'4599'的字符串都返回。1.开启线程代码如下:import com.baidu.model.ConCallable; import com.baidu.model.PropertiesTest; import ...
  • 获取导入excel文件中的数据,存入list中进行多线程处理,设定每个线程处理多少条数据,进行设定值动态启动线程数量数据,根据线程处理 数量拆分动态list数据进行相关业务操作 package com.ig.bi.game.controller; ...
  • 多线程处理一个list集合

    千次阅读 2015-05-13 10:26:12
    import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
  • 多线程Future处理list数据

    千次阅读 2020-07-20 14:44:58
    * 多线程处理list数据 */ public Map<String, Object> execuleThread() { Map<String, Object> ret = new LinkedHashMap<>(); try { Long t1 = System.currentTimeMillis(); List<...
  • 使用stream有序循环效率跟普通循环一样,stream多线程循环效率明显高很多。 import java.util.ArrayList; import java.util.List; import static java.lang.Thread.sleep; public class Test3 { public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 208,416
精华内容 83,366
关键字:

多线程处理list集合