在java中使用多线程计算从1到100000000的数字之和

在java中使用多线程计算从1到100000000的数字之和,java,multithreading,Java,Multithreading,我试图用Java编写一个程序,使用多线程技术打印从1到100000000的数字总和。其思想是第一个线程将计算从1到25000000的数字之和;第二个线程将计算这些数字的总和 从25000001到50000000,以此类推。主线程必须在完成后打印出总数 收集结果。我尝试扩展Thread类 class Thread1扩展了线程{ 公开募捐{ //int i=num; int i; 对于(i=1;i您正在每个单线程实现中创建mainThread的新实例。这将是一个问题,因为它们不会共享相同的结果。您也

我试图用Java编写一个程序,使用多线程技术打印从1到100000000的数字总和。其思想是第一个线程将计算从1到25000000的数字之和;第二个线程将计算这些数字的总和 从25000001到50000000,以此类推。主线程必须在完成后打印出总数 收集结果。我尝试扩展Thread类

class Thread1扩展了线程{
公开募捐{
//int i=num;
int i;

对于(i=1;i您正在每个单线程实现中创建
mainThread
的新实例。这将是一个问题,因为它们不会共享相同的结果。您也不会将该结果保留在任何位置

多线程处理非常复杂,并且会带来很多问题,因此我建议您阅读线程的锁定和同步:

[编辑]
我在原始答案中弄错了这一点。计算所有这些结果之和有更简单的方法:

您可以使用ForkJoinPool框架。定义返回值的RecursiveTask并对处理后的子结果求和

class SumRecursiveAction extends RecursiveTask<BigInteger> {

    private static final int PIVOT = 1000;

    private final int start;
    private final int end;
    private final List<Integer> list;

    public SumRecursiveAction(List<Integer> list, int start, int end) {
        this.start = start;
        this.end = end;
        this.list = list;
    }

    protected BigInteger compute() {
        if (end - start <= PIVOT) {
            // process if the range is within the pivot
            BigInteger sum = BigInteger.ZERO;
            for (int i = start; i < end; i++) {
                sum = sum.add(BigInteger.valueOf(list.get(i)));
            }
            return sum;
        } else {
            // or else delegate the task, fork and join
            int middle = start + ((end-start) / 2);
            RecursiveTask<BigInteger> otherTask = new SumRecursiveAction(list, start, middle);
            otherTask.fork();
            return new SumRecursiveAction(list, middle, end)
                    .compute()
                    .add(otherTask.join());
        }
    }
}
SumRecursiveAction类扩展了RecursiveTask{
专用静态最终整数轴=1000;
私人最终启动;
私人终端;
私人最终名单;
公共SumRecursiveAction(列表、int开始、int结束){
this.start=start;
this.end=end;
this.list=列表;
}
受保护的BigInteger计算(){

如果(结束-开始)“你所问的数学等价物是
100000000!
”你确定吗?@akuzminykh你是对的,我误解了这个问题,你在我编辑它时留下了那条评论!其余的你仍然是对的,它不适合
int
”\_(ツ)_/¯
List<Integer> list = IntStream.range(0, 100_000).boxed().collect(Collectors.toList());

ForkJoinTask<BigInteger> task = new SumRecursiveAction(list,0, list.size());
ForkJoinPool pool = new ForkJoinPool();
BigInteger sum = pool.invoke(task);


System.out.println("Sum: " + sum);