多线程分段求和

简介: 该代码实现了一个多线程计算求和的程序。`MyThread`类中,`sum`方法计算指定范围的和,`divide`方法将任务分块,`sunFirst`使用线程池并行计算各块的和,结果存入`list1`。通过`CountDownLatch`同步线程,所有线程完成后输出总和。测试用例展示了10个线程计算1到10000的和,表明多线程加速效果。注意线程数量与性能的关系,需权衡线程切换成本。

思路:先计算每个线程计算的数据范围,使用线程计数器,所有线程计算结束后累加

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.SynchronousQueue;

/**
 * @author Zing
 * @create 2022-11-07 14:17
 */
public class MyThread {
   
    private List list1 = new ArrayList();

    private List list2 = new ArrayList();

//    分段求和
    public long sum(long start,long n){
   
        long sum = 0;
        for(long i = start;i <= n;i++){
   
            sum+= i;
        }
        return sum;
    }

    public void sum(){
   
        long sum = 0;
        for (Object o : list1) {
   
            sum += (long) o;
        }
        System.out.println(sum);
    }

//    list2记录每个线程的第一个和最后一个数字
    public void divide(long n,long x){
   
        long block = n / x;
        long temp = block;
        long j = 1;
        for (long m = 1;m <= x;m++){
   
            list2.add(j);
            list2.add(temp);
            j = temp + 1;
            temp = block * (m + 1);
        }
    }

    public void sunFirst(long n,long x) throws InterruptedException {
   
        divide(n,x);
        CountDownLatch countDownLatch =new CountDownLatch(list2.size() / 2);
        for(int h = 1;h < list2.size();h+=2){
   
            int finalH = h;
            new Thread(()->{
   
                long realSum = sum((long) list2.get(finalH - 1),(long) list2.get(finalH));
                System.out.println("real sum" + finalH + ":" + realSum);
                list1.add(realSum);
                countDownLatch.countDown();
            }).start();
        }
        countDownLatch.await();
        System.out.println("success");
        sum();
    }


}

测试:

public class test {
   
    public static void main(String[] args) throws InterruptedException {
   

        MyThread myThread = new MyThread();
        myThread.sunFirst(10000,10);

    }
}

计算十亿暴力时间戳差为370,十个线程仅90,这不是最佳匹配,要考虑线程切换资源适配合适的线程数量,但是多线程始终比暴力快

相关文章
|
4月前
|
算法 测试技术 C++
【数据结构】【双堆】【滑动窗口】3013. 将数组分成最小总代价的子数组 II
【数据结构】【双堆】【滑动窗口】3013. 将数组分成最小总代价的子数组 II
|
11月前
|
Java
Java线程求和
Java线程求和
62 0
|
10月前
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
327 0
|
4月前
|
算法 Java 大数据
利用Java实现随机采样
利用Java实现随机采样
150 0
|
4月前
|
设计模式 算法 Java
【数据结构和算法】 K 和数对的最大数目
给你一个整数数组nums和一个整数k。 每一步操作中,你需要从数组中选出和为k的两个整数,并将它们移出数组。 返回你可以对数组执行的最大操作数。
62 2
|
4月前
|
设计模式 算法 Java
【数据结构和算法】交替合并字符串
给你两个字符串word1和word2。请你从word1开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回合并后的字符串。
92 1
|
Java
多线程交替输出A1B2C3D4...你怎么实现?
多线程交替输出A1B2C3D4...你怎么实现?
86 0
|
机器学习/深度学习
13:分段函数
13:分段函数
107 0