多线程求和

时间:2015-12-18 20:24:23

标签: java multithreading exception exception-handling

我想要一个大长度数组(例如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" 

1 个答案:

答案 0 :(得分:2)

使用Java 8可以做到

long sum = IntStream.of(array).parallel().sum();

这将分解数组,以便可以使用您机器上的每个CPU。

注意:如果你只有几千个数字要加起来,你可能会发现启动一个线程需要更长的时间。也就是说,你需要总结一个非常大的阵列才能看到改进。