多线程Callable处理数据

2021-02-04 16:15

阅读:747

标签:res   拆分   ret   提交   exe   取数   service   final   new   

1.数据拆分多线程Callable处理

1.定义一个20大小的线程池
2.根据数据 List 处理每个线程可以分到的数量List
3.Callable 线程处理数据
4.Future 获取Callcable线程处理后的数据
5.把 Future 获取的数据重新 addAll 进 List
6.返回数据

代码如下:

public List packageStrings(List list) throws InterruptedException, ExecutionException{
        // 开始时间
        long start = System.currentTimeMillis();
        // 线程数量
        int threadNum = 20;
        // 每条线程处理的数据
        int count = list.size() / threadNum;
        if (0 != list.size() % count) {
            threadNum++;
        }
        // 创建一个线程池
        ExecutorService exec = Executors.newFixedThreadPool(threadNum);
        // 定义一个任务集合
        List>> tasks = new ArrayList>>();
        int end = 0;
        for (int i = 0; i ) {
            if(i*count+count>list.size()) {
                end = list.size();
            } else {
                end = i*count+count;
            }
            // 确定每条线程的数据
            List cutList = list.subList(i*count, end);
            final List listStr = cutList;
            final List newList = new ArrayList();
            Callable> task = new Callable>() {
                @Override
                public List call() throws Exception {
                    for (String str : listStr) {
                        // 封装处理数据
                        str = packageString(str);
                        newList.add(str);
                    }
                    return newList;
                }
            };
            // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
            tasks.add(task);
        }
        // 获取数据并重新set
        List>> results = exec.invokeAll(tasks);
        list.clear();
        for (Future> future : results) {
            list.addAll(future.get());
        }
        // 关闭线程池
        exec.shutdown();
        //System.out.println(list.toString());
        System.err.println("\n执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
        return list;
    }

 

 2.数据未拆分多线程Callable处理数据

1.定义一个20大小的线程池

2.定义 Callable 的任务集合

3.遍历List处理数据

4.把 Callable 添加到 Callable 的任务集合中

5.把通过 Future 获取的数据并重新 add 进 List

6.返回数据

代码如下:

public List CallablePackageStrings(List list) throws InterruptedException, ExecutionException{
        // 开始时间
        long start = System.currentTimeMillis();
        // 线程数量
        int threadNum = 20;
        // 创建一个线程池
        ExecutorService exec = Executors.newFixedThreadPool(threadNum);
        // 定义一个任务集合
        List> tasks = new ArrayList>();
        // 处理数据
        for (final String str : list) {
            Callable task = new Callable() {
                @Override
                public String call() throws Exception {
                    // 封装处理数据
                    return packageString(str);
                }
            };
            // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
            tasks.add(task);
        }
        // 获取数据并重新set
        List> results = exec.invokeAll(tasks);
        list.clear();
        for (Future future : results) {
            list.add(future.get());
        }
        // 关闭线程池
        exec.shutdown();
        //System.out.println(list.toString());
        System.err.println("\n执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
        return list;
    }

 

 3.数据未拆分多线程Callable处理数据

1.定义一个20大小的线程池

2.定义Future的任务集合

3.遍历List处理数据

4.把 Future 添加到 Future 的任务集合中

5.把通过 Future 获取的数据并重新 add 进 List

6.返回数据

代码如下:

public List packageStrings(List list) throws InterruptedException, ExecutionException{
        // 开始时间
        long start = System.currentTimeMillis();
        // 线程数量
        int threadNum = 20;
        // 创建一个线程池
        ExecutorService exec = Executors.newFixedThreadPool(threadNum);
        // 定义FutureTask任务集合
        List> futures = new ArrayList>();
        // 处理数据
        for (final String str : list) {
            Future future = exec.submit(new Callable() {
                @Override
                public String call() throws Exception {
                    // 封装处理数据
                    return packageString(str);
                }
            });
            futures.add(future);
        }
        list.clear();
        for (Future future : futures) {
            list.add(future.get());
        }
        // 关闭线程池
        exec.shutdown();
        //System.out.println(list.toString());
        System.err.println("\n执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
        return list;
    }

 

以上三种推荐第三种:

第二种是在第一种基础上进行优化

第三种是在第二种基础上进行冗余代码去除

多线程Callable处理数据

标签:res   拆分   ret   提交   exe   取数   service   final   new   

原文地址:https://www.cnblogs.com/mjtabu/p/12793293.html


评论


亲,登录后才可以留言!