ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java批量多线程计算

2021-12-21 23:02:46  阅读:202  来源: 互联网

标签:task java 批量 work 线程 Integer Ready done 多线程


1、需求

把计算分批交给多个不同子线程进行暂时异步并发计算,最终主线程汇总计算结果。

2、示例代码

package javabasic.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class CallableWaitDemo {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        Integer num = 10;
        List<FutureTask<Integer>> list = new ArrayList<>(num);
        for (int i = 1; i <= num; i++) {
            FutureTask<Integer> task = new FutureTask(new MyCallable(String.valueOf(i),1000, i));
            //new Thread(task).start();
            threadPool.submit(task);
            list.add(task);
        }

        Integer sum = 0;
        for (FutureTask<Integer> v : list) {
            try {
                sum += v.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

        Integer verifySum = 0;
        for (int i = 1; i <= num; i++) {
            verifySum += i * 1000;
        }

        System.out.println();
        System.out.println("多线程计算累计总和:" + sum);
        System.out.println("主线程校验累计总和:" + verifySum);

        if(!threadPool.isShutdown()){
            threadPool.shutdown();
        }



    }
}

3、任务线程类

package javabasic.thread;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {

    private String name;
    private Integer s;
    private Integer num;

    public MyCallable(String name, Integer s, Integer num) {
        this.name = name;
        this.s = s;
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
        System.out.println("线程" + name + " Ready to work");
        Thread.currentThread().sleep(s * num);
        Integer data = s * num;
        System.out.println("线程" + name + " task done,中间结果:" + data);
        return data;
    }

}

输出打印

线程2 Ready to work
线程3 Ready to work
线程1 Ready to work
线程4 Ready to work
线程5 Ready to work
线程1 task done,中间结果:1000
线程6 Ready to work
线程2 task done,中间结果:2000
线程7 Ready to work
线程3 task done,中间结果:3000
线程8 Ready to work
线程4 task done,中间结果:4000
线程9 Ready to work
线程5 task done,中间结果:5000
线程10 Ready to work
线程6 task done,中间结果:6000
线程7 task done,中间结果:7000
线程8 task done,中间结果:8000
线程9 task done,中间结果:9000
线程10 task done,中间结果:10000

多线程计算累计总和:55000
主线程校验累计总和:55000

标签:task,java,批量,work,线程,Integer,Ready,done,多线程
来源: https://blog.csdn.net/jiahao1186/article/details/122075183

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有