我想要一个大长度数组(例如30,000,000)并优化时间消耗。
我跟进了多线程的想法......例如,我编写了一个3000长度数组的代码,并被3个不同的线程划分,得到每个三分之一的总和,并在最后一步使用顺序加法。
不幸的是,我在处理3个线程中的异常时遇到错误。 正如在控制台消息中提到的那样。
任何帮助?
//File Name : ThreadClassDemo.java
package experiment;
import java.util.Arrays;
public class ThreadClassDemo {
public static void main(String[] args) {
double xarr[] = new double[3000];
Arrays.fill(xarr, 1);
System.out.println(xarr[2999]);
double x=0;
Runnable first1 = new DisplayMessage(x,xarr,0,999);
Thread thread1 = new Thread(first1);
thread1.setDaemon(true);
thread1.start();
double y=0;
Runnable first2 = new DisplayMessage(y,xarr,1000,1999);
Thread thread2 = new Thread(first2);
thread2.setDaemon(true);
thread2.start();
double z=0;
Runnable first3 = new DisplayMessage(z,xarr,2000,2999);
Thread thread3 = new Thread(first3);
thread3.setDaemon(true);
thread3.start();
}
}
package experiment;
//File Name : DisplayMessage.java
//Create a thread to implement Runnable
public class DisplayMessage implements Runnable {
public double result = 0;
private double arr[];
private int num1;
private int num2;
public DisplayMessage(double i, double[] xarr, int j, int k) {
result = i;
xarr = arr;
num1 = j;
num2 = k;
}
/*
* public DisplayMessage(String message) { this.message = message; }
*/
public double getresult(){return result;}
public void run() {
try {
System.out.println("dsfsfs");
for (int i = num1; i <= num2; i++) {
result += arr[i];
}
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println(" interrupted.");
}
}
}
控制台:
Exception in thread "Thread-0" Exception in thread "Thread-2" Exception in thread "Thread-1"
答案 0 :(得分:2)
使用Java 8可以做到
long sum = IntStream.of(array).parallel().sum();
这将分解数组,以便可以使用您机器上的每个CPU。
注意:如果你只有几千个数字要加起来,你可能会发现启动一个线程需要更长的时间。也就是说,你需要总结一个非常大的阵列才能看到改进。