java多线程加法运算,求大神!!

「已注销」 2019-01-01 11:58:48
先产生一个大于10的随机整数n,再产生n个随机数并存放于数组中,然后将这n个数相加,并求出这n个数的和s1,同时计算出求s1所需的时间t1。接着让程序创建两个线程并发地进行相加运算,其中,一个线程计算前一半数之和s21,另一个线程计算后一半数之和s22,然后将s21和s22这两个数相加得到和s2,计算采用双线程进行求和运算所花费的时间t2。比较s1和s2,以及t1和t2的大小。注:在计算采用双线程求和的时间t2时,只要计算从创建双线程到最终得到s2的时间间隔就可以了。
...全文
399 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lionsarmstrong 2019-01-02
  • 打赏
  • 举报
回复

package com.jeemis.framework.file.util;

import java.util.*;
import java.util.concurrent.*;

/**
 * Project Name: AirPortEHome
 * Package Name: com.jeemis.framework.file.util
 * File Name: Test
 * 2019/1/2 13:16 - LiZongBao
 * Copyright (c) 2017,TravelSky. All Rights Reserved.
 */
public class Test {
    public static void main(String[] args)  throws ExecutionException,InterruptedException {
        //先产生一个大于10的随机整数n
        int n=(int)(1+Math.random()*(10-1+1));//(数据类型)(最小值+Math.random()*(最大值-最小值+1))
        //再产生n个随机数并存放于数组中,
        int[] nArr=new int[n];
        for(int i=0;i<n;i++){
            nArr[i]=(int)(1+Math.random()*10);
        }
        // 然后将这n个数相加,并求出这n个数的和s1,同时计算出求s1所需的时间t1。
        long startMili=System.currentTimeMillis();// 当前时间对应的毫秒数
        int s1=0;
        for(int i=0;i<n;i++){
            s1+=nArr[i];
        }
        long endMili=System.currentTimeMillis();
        long t1=endMili-startMili;
        System.out.println("t1总耗时为:"+t1+"毫秒");
        System.out.println("这n个数的和s1为:"+s1);
        // 接着让程序创建两个线程并发地进行相加运算,
        int taskSize = 2;
        // 创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(taskSize);
        // 创建多个有返回值的任务
        List<Future> list = new ArrayList<Future>();
        // 其中,一个线程计算前一半数之和s21,
        // 另一个线程计算后一半数之和s22,
        for (int i = 0; i < taskSize; i++) {
            Callable c = new MyCallable(i,nArr);
            // 执行任务并获取Future对象
            Future f = pool.submit(c);
            // System.out.println(">>>" + f.get().toString());
            list.add(f);
        }
        // 关闭线程池
        pool.shutdown();
        // 获取所有并发任务的运行结果
        long t2=0;
        int s2=0;
        for (Future f : list) {
            // 从Future对象上获取任务的返回值,并输出到控制台
            Map m= (Map) f.get();
            System.out.println(">>>" + f.get().toString());
            // 然后将s21和s22这两个数相加得到和s2,
            s2+=(int)m.get("s2");
            // 计算采用双线程进行求和运算所花费的时间t2。
            t2+=(long)m.get("time");
        }
        // 比较s1和s2,以及t1和t2的大小。
        System.out.println("t2总耗时为:"+t2+"毫秒");
        System.out.println("这n个数的和s2为:"+s2);
        // 注:在计算采用双线程求和的时间t2时,只要计算从创建双线程到最终得到s2的时间间隔就可以了。
    }
    static class MyCallable implements Callable<Object> {
        private int taskNum;
        private int[] nArr;

        MyCallable(int taskNum,int[] nArr) {
            this.taskNum = taskNum;
            this.nArr = nArr;
        }

        public Object call() throws Exception {
            System.out.println(">>>" + taskNum + "任务启动");
            Date dateTmp1 = new Date();
            int s2=0;
            if(taskNum==0){
                for(int i=0,size=nArr.length/2;i<size;i++){
                    s2+=nArr[i];
                }
            }else if(taskNum==1){
                for(int i=nArr.length/2,size=nArr.length;i<size;i++){
                    s2+=nArr[i];
                }
            }
            Date dateTmp2 = new Date();
            long time = dateTmp2.getTime() - dateTmp1.getTime();
            Map m=new HashMap();
            m.put("time",time);
            m.put("s2",s2);
            System.out.println(">>>" + taskNum + "任务终止");
            return m;
        }
    }
}

试了几个结果,=10的话有点太小了,时间一直都是0,下面是加大为100000000之后的计算结果。 t1总耗时为:9毫秒 这n个数的和s1为:35255207 >>>1任务启动 >>>0任务启动 >>>1任务终止 Disconnected from the target VM, address: '127.0.0.1:55870', transport: 'socket' >>>0任务终止 >>>{time=14, s2=17627876} >>>{time=11, s2=17627331} t2总耗时为:25毫秒 这n个数的和s2为:35255207

50,503

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧