2013-07-22 62 views
-5

我已經創建了一個程序來將一個數組拆分爲兩個數組,然後在將它們合併到一起之後進行排序。通過多線程排序

當我直接調用run()時,我的程序完美工作,但是當我使用start()時,我得到一個NullPointerException

誰能告訴我如何解決這一問題?

public class SortingClass extends Thread{ 
    public int[] arr, arr0; 

    public SortingClass(int[] a){ 
     this.arr = a; 
    } 

    @Override 
    public void run() { 
     this.arr0 = sorting(arr); 
    } 

    public int[] sorting(int[] a){ 
     int value; 
     int j; 

     for (int i = 1; i < a.length; i++){ 
      value = a[i]; 
      j = i-1; 

      while(j>=0 && a[j]>value){ 
       a[j+1] = a[j]; 
       j = j-1; 
      } 
      a[j+1] = value; 
     } 
     return a; 
    } 

    public static int[] merge(int[] A, int[] B) { 
     int size = A.length + B.length; 
     int C [] = new int [size]; 
     int i, a = 0, b = 0; 

     for(i=0; i<size; i++){ 
      if(a == A.length){ 
       C[i] = B[b]; 
       ++b; 
      } else if(b == B.length){ 
       C[i] = A[a]; 
       ++a; 
      } else if(A[a] > B[b]) { 
       C[i]=B[b]; 
       ++b; 
      } else { 
       C[i] = A[a]; 
       ++a; 
      } 
     } 

     return C; 
    } 

    public static void print(int[] a, int[] b){ 
     System.out.println("Before \t After"); 
     for (int i = 0; i < a.length; i++) { 
      System.out.printf("%d \t %d\n",a[i],b[i]); 
     }  
    } 

    public static void main(String[] args) { 
     int[] arr = new int[10]; 
     int[] arr0; 
     Random r = new Random(); 

     for(int i = 0; i<arr.length; i++){ 
      //arr[i] = r.nextInt(100); 
      arr[i] = i; 
     } 

     int[] arr1,arr2; 
     arr1 = new int[arr.length/2]; 
     arr2 = new int[arr.length/2]; 

     int i = 0; 
     int j = 0; 
     while(i<arr.length){ 
      if (i < arr.length/2){ 
       arr1[i] = arr[i]; 
      } else { 
       arr2[j] = arr[i]; 
       j++; 
      } 
      i++;  
     } 

     SortingClass s1 = new SortingClass(arr1); 
     SortingClass s2 = new SortingClass(arr2); 

     s1.start(); 
     s2.start(); 

     arr0 = merge(s1.arr0,s2.arr0); 
     print(arr, arr0); 
    } 
} 
+3

什麼生產線生產NPE? –

回答

8

在線程完成運行之前,您正在調用merge()
因此,arr0爲空。

你需要等待每個線程調用.join()完成。

當您調用.run()時,您直接在調用線程中運行方法(與其他方法調用一樣,且不涉及Thread),所以沒有任何問題。

+0

謝謝,它現在的作品,現在我明白:) –

+0

不客氣。你應該通過點擊空心支票來接受這個答案。 – SLaks