有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ExecutorService池不工作的数组中所有元素的java总和

我试图理解ExecutorService,我想对数组中的所有元素求和。我使用了两种方法,一种是串行求和(只是对所有元素求和的for循环),另一种是与池并行。我的问题是,几乎所有时候,使用ExecutorService得到的总金额都与序列金额不符,有时甚至只差一个

package sumArregloConc;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class SumaArregloMain {

    private final static int cantElem = 1000;
    private static ExecutorService tpool = Executors.newCachedThreadPool();



    public static void main(String[] args)
    {

        int[] arreglo = generarArreglo(cantElem); //generate the array with random numbers

        System.out.println(sumaSerial(arreglo));
        System.out.println(sumaConcurrente(arreglo));
    }

    public static int sumaSerial(int[] arreglo)
    {
        int suma = 0;
        for(int i =0; i< arreglo.length; i++)
        {
            suma += arreglo[i];
        }

        return suma;

    }

    public static int sumaConcurrente(int[] arreglo)
    {
        AtomicInteger total = new AtomicInteger(0);

        for(int i = 1 ; i < cantElem; i++){

            int a = arreglo[i];
                Thread thread = new Thread(new Runnable(){
                    public void run() {
                        int res = a;
                        total.addAndGet(res);
                        return;
                }});
                tpool.submit(thread);
        }

        tpool.shutdown(); //wait for everything to finish
        return total.get();
    }

    public static int[] generarArreglo(int cantElem)
    {
        int[] arreglo = new int[cantElem];
        Random rand = new Random();

        for(int i = 0; i < cantElem; i++)
        {
            arreglo[i] = rand.nextInt(10);
        }

        return arreglo;
    }
}

有人能告诉我是怎么回事吗


共 (1) 个答案

  1. # 1 楼答案

    找到了错误。首先,Eric谈到了waittermination和Runnable,但主要的错误是循环从i=1开始,而不是i=0,这是一个愚蠢的错误

        public static int sumaConcurrente(int[] arreglo)
        {
            AtomicInteger total = new AtomicInteger(0);
    
            for(int i = 0 ; i < cantElem; i++){
    
                int a = arreglo[i];
    
                tpool.submit(new Runnable(){
                    public void run() {
                        total.addAndGet(a);
                        return;
                        }
                    });
            }
    
            tpool.shutdown(); //wait for everything to finish
            try {
                  tpool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {  
                }
            return total.get();
        }