多线程分段求和

简介: 该代码实现了一个多线程计算求和的程序。`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,这不是最佳匹配,要考虑线程切换资源适配合适的线程数量,但是多线程始终比暴力快

相关文章
|
NoSQL 前端开发 Redis
《我们一起进大厂》系列-秒杀系统设计
《我们一起进大厂》系列-秒杀系统设计
292 2
|
监控 NoSQL Redis
如果 Redis 宕机,怎么保证它系统的可用性、持久性、安全性
如果 Redis 宕机,怎么保证它系统的可用性、持久性、安全性
426 0
|
存储 缓存 监控
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出 本文来带大家学习Java OOM的三大经典场景以及解决方案,保证让你有所收获!
6043 0
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
|
5月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1550 7
|
移动开发 JavaScript 前端开发
HTML5 表单属性详解
HTML5引入了多种新的表单属性,使表单创建与验证更加便捷高效。新增的输入类型包括`email`、`url`、`tel`等,常用属性有`placeholder`、`required`等。表单元素如`&lt;form&gt;`可设置提交方法和目标URL,`&lt;button&gt;`及`&lt;input type=&quot;submit&quot;&gt;`用于提交。新元素`&lt;datalist&gt;`和`&lt;output&gt;`提供更多功能。HTML5还提供了内置表单验证机制,增强用户体验。
|
8月前
|
缓存 监控 NoSQL
场景题:线上接口响应慢,应该如何排查问题?
面试中常见的接口响应慢排查题旨在考察研发人员的系统性解决问题的能力。回答时需结合业务场景(如大促、高峰期),并运用工具(Arthas、SkyWalking等)进行监控告警、链路追踪和日志分析,明确问题范围及原因。具体步骤包括:1. 定位问题(确认单个接口或整体系统、查看APM指标、分析链路和日志);2. 排查网络、中间件及外部依赖(检测延迟、检查Redis、RocketMQ、MySQL等);3. 服务端性能分析(CPU、内存、磁盘IO、JVM调优)。最后提出优化方案,如代码逻辑、数据库、缓存策略及资源扩容等。总结时可结合实际案例,展示完整的排查与优化流程。
1455 3
|
缓存 NoSQL 应用服务中间件
【开发系列】秒杀系统的设计
【开发系列】秒杀系统的设计
|
开发框架 数据可视化 Windows
如何提升大模型Agent的能力 ——LLM Agent框架 Modelscope-Agent 实战
本文介绍Agent到底是什么 ,如何进行优化,以及如何使用Agen框架。
|
数据采集 存储 数据挖掘
Python网络爬虫实战:抓取并分析网页数据
使用Python的`requests`和`BeautifulSoup`,本文演示了一个简单的网络爬虫,抓取天气网站数据并进行分析。步骤包括发送HTTP请求获取HTML,解析HTML提取温度和湿度信息,以及计算平均温度。注意事项涉及遵守robots.txt、控制请求频率及处理动态内容。此基础爬虫展示了数据自动收集和初步分析的基础流程。【6月更文挑战第14天】
969 9