【问题标题】:Sum of all the elements in an array with ExecutorService pool not workingExecutorService 池不起作用的数组中所有元素的总和
【发布时间】:2023-04-03 14:58:01
【问题描述】:

我正在尝试了解 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;
    }
}

谁能告诉我哪里错了?

【问题讨论】:

  • 你需要在你的线程池上调用awaitTermination()。只需调用 shutdown 将不允许提交新任务,但它不会等待排队/正在执行的任务完成。
  • 另外,将线程提交给ExecutorService 有点不寻常(这甚至可能吗??)。只需提交Runnables 即可。
  • 感谢您的信息,我已将其添加到我的代码中。无论如何,我发现了真正的错误。不是从 i = 0 开始,而是从 i = 1 开始
  • @Eric 这并不罕见,这是一个错误。 Thread 实现 Runnable 是一个历史性的设计错误,它会引发此类错误(并且没有实际用途)。

标签: java multithreading concurrency threadpool executorservice


【解决方案1】:

发现错误。首先是 Eric 所说的 awaitTermination 和 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();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多