【问题标题】:Sorting by multithreading [closed]按多线程排序[关闭]
【发布时间】:2013-07-21 14:42:40
【问题描述】:

我创建了一个程序将一个数组拆分为两个数组,然后将它们重新合并在一起。

当我直接调用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);
    }
}

【问题讨论】:

  • 哪一行生成 NPE?

标签: java multithreading concurrency


【解决方案1】:

您在线程完成运行之前调用merge()
因此,arr0 为空。

您需要通过调用.join() 来等待每个线程完成。

当您调用.run() 时,您直接在调用线程中运行该方法(与任何其他方法调用一样,并且不涉及Thread),因此没有任何问题。

【讨论】:

  • 谢谢,它现在可以工作了,我很感激 :)
  • 不客气。您应该通过单击空心检查来接受此答案。
猜你喜欢
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 2013-08-11
相关资源
最近更新 更多