多线程并行计算案例

1. 提出问题

计算 1 + 2 + 3 + 4 + … + 997 + 998 + 999+ 1000 = ?

2. 单线程计算

采用的单线程进行累加求和,先算1 + 2 = 3 再算 3 + 3 = 6 再算 6 + 4 = 10,依次类推直至加到1000,其中要累加999次,假设每次累加至少耗时1ms,这样计算则至少需要999ms。

2.1 代码实现

public static void test01() throws InterruptedException{
    long sum = 0;
    // 记录计算的开始时间
    long begin = System.currentTimeMillis();
    for (long i = 1; i <= 1000; i++) {
        // 进行依次累加
        sum = sum + i;
        // 模拟耗时1ms
        Thread.sleep(1);
    }
    // 记录计算的结束时间
    long end = System.currentTimeMillis();
    // 打印计算结果与耗时
    System.out.println("单线程计算结果:" + sum + " 耗时:" + (end - begin) + "ms");
}

2.2 运行结果

在这里插入图片描述

3. 多线程计算

一个人执行任务,由于任务量大耗时较长,如果有十个人来做这批任务,它的效率理论上要提升十倍。1000个数求和,假如我有十个工人,每个工人平分工作任务各分得100个数,每个人只需要累加99次,最后汇总每位工人的计算结果就得出最终结果。

在这里插入图片描述

3.1 代码实现

  • 任务执行者
public class ComputeCallable implements Callable<Long>
{
    /**
     * 计算者名称
     */
    private String computeName;

    /**
     * 任务开始值
     */
    private Long beginValue;

    /**
     * 任务结束值
     */
    private Long endValue;

    public ComputeCallable(String computeName, Long beginValue, Long endValue) {
        this.computeName = computeName;
        this.beginValue = beginValue;
        this.endValue = endValue;
    }
    
    /**
     * 计算逻辑
     * @return 计算结果
     */
    @Override
    public Long call() throws Exception {
        long result = 0;
        // 记录计算的开始时间
        long begin = System.currentTimeMillis();
        for (long i = beginValue; i <= endValue; i++) {
            // 进行依次累加
            result = result + i;
            // 模拟耗时1ms
            Thread.sleep(1);
        }
        // 记录计算的结束时间
        long end = System.currentTimeMillis();
        // 打印计算结果与耗时
        System.out.println(computeName + "计算结果:" + result + " 耗时:" + (end - begin) + "ms");
        return result;
    }

    public String getComputeName(){
        return computeName;
    }
}
  • 任务分配者
public static void test02() throws ExecutionException, InterruptedException{
    List<FutureTask<Long>> results = new ArrayList<>(10);
    // 记录计算的开始时间
    long begin = System.currentTimeMillis();
    // 将任务平均分配给十个工人
    for (int i = 0; i < 10; i++) {
        // 定义工人任务信息
        String computeName = "工人" + (i + 1);
        long beginValue = i * 100 + 1;
        long endValue = (i + 1) * 100;
        // 工人分得任务信息
        ComputeCallable computeCallable = new ComputeCallable(computeName, beginValue ,endValue);
        FutureTask<Long> futureTask = new FutureTask<>(computeCallable);
        Thread thread = new Thread(futureTask, computeCallable.getComputeName());
        // 工人执行任务
        thread.start();
        // 记录工人任务结果
        results.add(futureTask);
    }
    // 汇总每个工人的计算结果
    long sum = 0;
    for (FutureTask<Long> result : results) {
        // 汇总
        sum = sum + result.get();
        // 模拟耗时1ms
        Thread.sleep(1);
    }
    long end = System.currentTimeMillis();
    // 打印计算结果与耗时
    System.out.println("多线程计算结果:" + sum + " 耗时:" + (end - begin) + "ms");
}

3.2 运行结果

在这里插入图片描述

4. FutureTask

FutureTask是一个可取消的异步任务,可以调用方法开始和取消一个任务,可以查询获取计算结果,FutureTask的状态大致可以分为三种:

  • 任务未启动
  • 任务执行中(可能是已经启动,只是没有开始执行)
  • 任务已完成
    在这里插入图片描述

FutureTask类实现了Future接口,Future接口提供了五个方法:

  • // 尝试取消任务
    boolean cancel(boolean mayInterruptIfRunning)
    
  • // 任务正常结束前取消返回true
    boolean isCancelled()
    
  • // 任务正常结束、异常或被取消返回true
    boolean isDone()
    
  • // 等待任务结束获取结果
    V get() throws InterruptedException, ExecutionException
    
  • // 给定时间获取结果,规定时间任务未完成抛出异常
    V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
    

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《并行计算结构算法编程第三版》是一本讲述并行计算的编程技术和算法的书籍。本书介绍了并行计算的基本概念、并行算法设计和并行编程模型。通过学习这本书,读者可以了解到如何在并行计算环境中进行高效的算法设计和编程。 本书首先介绍了并行计算的背景和发展,并解释了并行计算的基本概念和分类。随后,本书详细介绍了并行算法设计的基本原理和方法,包括任务并行、数据并行和流水线并行等。读者可以学习到如何根据具体问题的特点选择合适的并行算法设计方法,并掌握相应的设计技巧。 同时,本书还详细介绍了常见的并行程序设计模型,包括MPI、OpenMP和CUDA等。读者可以学习到如何使用这些编程模型来实现并行算法,提高程序的性能和效率。此外,本书还介绍了一些常见的并行算法,如排序算法、图算法和矩阵运算等,读者可以通过学习这些算法来掌握并行算法设计的基本方法。 总之,《并行计算结构算法编程第三版》是一本很好的学习并行计算的书籍。通过学习此书,读者可以了解到并行计算的基本概念和分类,并掌握并行算法设计的原理和方法。同时,通过学习常见的并行程序设计模型和算法,读者可以提高程序的性能和效率,实现更高效的并行计算。这本书对于从事并行计算和并行编程的人士来说是一本很好的参考书籍。 ### 回答2: 《并行计算结构算法编程第三版pdf》是一本介绍并行计算、结构算法和编程的书籍,对于学习并行计算和算法编程的人来说是一本非常有价值的参考资料。 本书的第三版相较于前两版进行了全面的更新和完善。第三版通过详细讲解并行计算的原理和方法,使读者能够深入了解并行计算的基本概念和技术。同时,书中还介绍了各种并行算法和数据结构,包括并行排序、并行搜索、并行图算法等,让读者掌握使用并行计算进行高效算法设计和编程的基本原则。 此外,本书还介绍了一些常用的并行编程模型和框架,如MPI和OpenMP等,在实际应用中帮助读者快速上手并行编程。同时,针对不同的并行计算平台,如多核CPU、GPU等,本书还详细讲解了相应的优化技巧和编程方法,使读者能够在不同的硬件平台上实现高效的并行计算。 总之,《并行计算结构算法编程第三版pdf》是一本较为全面且实用的并行计算和算法编程教材,适合对并行计算和算法设计感兴趣的读者阅读。通过学习本书,读者可以深入了解并行计算的原理和方法,掌握并行算法和数据结构的设计思想,同时还能够学习到并行编程的技巧和实践经验,对于提高并行计算和算法设计的水平有很大的帮助。 ### 回答3: 《并行计算结构算法编程第三版pdf》是一本经典的计算机科学教材,主要介绍了并行计算结构和算法设计的相关知识。该书以pdf形式提供,方便读者在电子设备上进行阅读。 《并行计算结构算法编程第三版pdf》一书分为多个章节,全面介绍了并行计算的相关概念和原理。首先,书中讲解了并行计算的基本概念和分类,引导读者了解并行计算的基本知识。然后,书中详细介绍了不同的并行计算结构,包括向量处理器、多处理器、分布式系统等,对这些并行计算结构的特点、优缺点进行了深入分析。此外,书中还介绍了一些经典的并行算法设计,如并行排序算法、并行查找算法等,读者可以学习如何设计高效的并行算法。 《并行计算结构算法编程第三版pdf》的特点之一是理论与实践相结合。书中不仅讲解了并行计算的理论知识,还通过大量的实例和案例分析,让读者更加深入地理解并行计算的应用。同时,书中还提供了大量的编程实践例子和习题,读者可以通过实践提升对并行计算的理解和应用能力。 总之,《并行计算结构算法编程第三版pdf》是一本权威的教材,适合计算机科学相关专业的学生、教师和研究人员阅读和学习,并行计算的基础知识和算法设计。读者可以通过阅读本书,提升对并行计算的理解和应用能力,为解决实际计算问题提供更好的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值