Java多线程经典面试题:编写代码,实现多线程大数组求和的问题(简单实现)

一、题目要求

二、实现思路

三、代码实现

四、执行结果


一、题目要求

1.给定一个很长的数组(长度1000w),通过随机数的方式生成1-100之间的整数。

2.实现代码,能够创建两个线程,对这个数组的所有元素求和。

3.其中线程1汇总计算偶数下表元素的和,线程2计算汇总奇数下标元素的和。

4.最终在汇总两个和,进行相加。

5.记录程序的执行时间。

二、实现思路

方法1:我们使用两个不带有返回值的线程,这样我们就需要创建两个全局变量,如果不是全局的变量,那么在lambda表达式中修改的时候会报错,lambda表达式中不允许修改变量。

方法2:创建两个带有返回值的线程,将这两个返回值累计即可。

在此处我仅仅将第二种方法实现。

三、代码实现

package thread.threaddemo;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Author: wenjingyuan
 * @Date: 2022/11/11/19:30
 * @Description:编写代码,实现多线程数组求和
 */
public class ThreadDemo15 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long stime=System.currentTimeMillis();
        int[] arrs=new int[10000000];
        //对数组内的值进行初始化
        Random random=new Random();
        for (int i = 0; i < arrs.length; i++) {
            arrs[i]=(random.nextInt(100)+1);
        }

        //创建线程1来计算偶数
        FutureTask<Integer> task=new FutureTask<Integer>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int temp=0;
                for (int i = 0; i <arrs.length ; i=i+2) {
                 temp+=arrs[i];
                }
                System.out.println("偶数累加的和为:"+temp);
                return temp;
            }
        });
        Thread thread=new Thread(task);
        thread.start();


        //创建线程2来计算奇数
        FutureTask<Integer> task1=new FutureTask<Integer>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int temp=0;
                for (int i = 1; i <arrs.length ; i=i+2) {
                    temp+=arrs[i];
                }
                System.out.println("奇数累加的和为:"+temp);
                return temp;
            }
        });
        Thread thread1=new Thread(task1);
        thread1.start();
        //如果我们创建的是两个普通的线程,则必须要加join
//        thread.join();
//        thread1.join();
        int sum=task.get()+task1.get();
        System.out.println("累加的和为:"+sum);
        long  etime=System.currentTimeMillis();
        System.out.println("程序执行时间为:"+(etime-stime));
    }
}

四、执行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值