欢迎访问宙启技术站
智能推送

Java多线程求和实例讲解

发布时间:2023-05-16 00:26:26

Java 多线程在并发编程中扮演重要的角色。在自己项目或者框架中常常需要多线程来加速程序的运行。今天我们通过一个简单的例子来详细讲解 Java 多线程的使用方法。

本文将介绍使用 Java 多线程实现一个简单的求和程序,可以用于协助理解多线程的基础使用方法。本文讲解的 Java 多线程求和实例包含以下内容:

1. 需求描述

2. 实现步骤

3. 源码解析

4. 总结

## 1. 需求描述

我们希望实现一个多线程求和程序,可以输入一个整数 n,然后使用多线程计算出 1 到 n 的和。

## 2. 实现步骤

1. 构建主程序入口,定义一个静态内部类 SumThread,用于实现多线程任务。

2. 在 SumThread 内部定义一个从 start 到 end 累加的静态方法 sum(),线程启动后调用该方法计算结果。

3. 主程序通过 Scanner 读取一个整数 n,并将 n 分为多个线程分别计算部分和。

4. 每个线程计算出它需要计算的部分和后,把部分和返回并存储在一个结果数组中。

5. 最终,主程序将结果数组中所有元素相加得到最终结果,并输出计算机运算完成时间。

## 3. 源码解析

下面是 Java 多线程求和程序的源代码:

import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class MainThread {

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入一个整数n:");
        int input=scanner.nextInt();
        long startTime=System.currentTimeMillis();
        int numThread=5;// 线程数量
        int[] results=new int[numThread];// 存放每个线程的部分和结果
        int endIndex;
        int startIndex=1;
        SumThread[] threads=new SumThread[numThread];// 存放线程的数组
        for (int i=0;i<numThread;i++) {
            endIndex=startIndex+input/numThread-1;
            if (i==numThread-1) {
                endIndex=input;
            }
            threads[i]=new SumThread(startIndex,endIndex);// 创建线程
            threads[i].start();// 启动线程
            startIndex=endIndex+1;
        }
        int sum=0;
        for (int i=0;i<numThread;i++) {
            try {
                threads[i].join();// 等待线程结束
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            results[i]=threads[i].getResult();// 获得线程计算的结果
        }
        for (int i=0;i<numThread;i++) {// 将所有线程的结果汇总起来
            sum+=results[i];
        }
        System.out.println("1加到"+input+"的和为:"+sum);
        long duration=System.currentTimeMillis()-startTime;
        System.out.println("用时:"+TimeUnit.MILLISECONDS.toSeconds(duration)+" 秒");
    }
    
    static class SumThread extends Thread {
        private int start,end,result;
        
        public SumThread(int start,int end) {
            this.start=start;
            this.end=end;
        }
        
        public int getResult() {
            return result;
        }

        public void run() {
            result=sum(start,end);// 计算部分和
        }
        
        public static int sum(int start,int end) {
            int sum=0;
            for (int i=start;i<=end;i++) {
                sum+=i;
            }
            return sum;
        }
    }
}

主函数中首先通过 Scanner 读取一个整数 n,然后启动 numThread 个线程计算部分和。每个线程设定startIndex 和 endIndex,startIndex 的初始值为 1,endIndex 初始值为 input / numThread - 1,在创建每个线程之前累加 startIndex 和 endIndex。最后一个线程的 endIndex 等于 input。

每个 SumThread 类实质上代表一个线程,通过实现 run() 方法来执行多线程任务。我们定义一个静态方法 sum() 来计算某个线程需要计算的部分和,用 result 变量保存计算结果,并在 getResult() 方法中返回结果。

主线程中监控所有子线程是否执行结束,即所有线程都调用了 join() 方法。如果线程结束的时候,它的结果会被存储在 result[] 数组中。最后,我们将所有元素相加得到最终结果,并输出计算时间。

## 4. 总结

Java 多线程提供了一种实现并发编程的方法,可以在提高程序效率同时简化编程。在本文中,我们通过一个简单的例子详细讲解了 Java 多线程的使用和实现方法,并给出了完整的 Java 源代码。阅读本文后,相信你已经对 Java 多线程有了更深入的了解。