【发布时间】: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