2012-05-15 60 views
1

我有一個學校任務,Iam將使用Java中的線程對一個長名單進行排序。沒有關注排序算法的速度,而是分配理解線程以及線程如何影響排序的速度。帶線程的泡泡排序

我覺得我在正確的道路上,但代碼/線程弄亂了顯示器,我試了一會兒才找到問題,對我來說這個問題似乎在class SortThreadsrun()方法。請人們給我一些提示或提示?

public void run() { 

    while (monitor.getSize() > 1) { 
     System.out.println("Number of array in list to be sorted: " 
       + monitor.getSize()); 

     String[] f = monitor.getRandom(); 
     String[] g = monitor.getRandom(); 

     monitor.add(descSort(f, g)); 
    } 

    System.out.println("*** THREAD DEAD ***"); 

} 

輸出:

After delete: 1 
Number of array in list to be sorted: 3 
Befor delete: 1 
After delete: 0 
Number of array in list to be sorted: 0 
Exception in thread "Thread-101" java.lang.NullPointerException 
    at SortThread.append(Sort.java:222) 
    at SortThread.descSort(Sort.java:201) 
    at SortThread.run(Sort.java:178) 
Exception in thread "Thread-96" java.lang.NullPointerException 
    at SortThread.append(Sort.java:222) 
    at SortThread.descSort(Sort.java:201) 
    at SortThread.run(Sort.java:178) 
Number of array in list to be sorted: 0 
Number of array in list to be sorted: 0 
+2

請只發布代碼的相關部分。我不打算在這篇文章中進行數據挖掘,以查找'run'方法的位置。 – Tudor

+0

你將不得不展示更多的工作,然後只是發佈_large_一堆代碼。你做了什麼調試?你看到了什麼輸出? – Gray

+0

我們可能會提供一些提示,但請首先詳細說明:它以什麼方式混淆? – Thomas

回答

1

你的一個(可能的)問題是,這部分是不是原子:

while (monitor.getSize() > 1) { 
    System.out.println("Number of array in list to be sorted: " 
      + monitor.getSize()); 

    String[] f = monitor.getRandom(); 
    String[] g = monitor.getRandom(); 

    monitor.add(descSort(f, g)); 
} 

通常情況下,如果你使用任何線程,則很可能之間的電話monitor.getSize()monitor.getRandom()之間的大小實際上已經改變。所以我猜getRandom調用之一(或兩者)返回null將觸發NullPointerException

在致電descSort()之前,您可以添加支票null。如果fg中只有一個是null,則可能需要將其重新放回顯示器中(這裏只是猜測)。

+0

那是正確的,檢查null和break;在f或g爲空的while while循環內消除NullPointerExceptions,並創建一個正確的排序數組。但是當f或g爲空時,沒有什麼要添加到容器中,因爲g和f是空的,是正確的? – user265767

+0

說實話我沒有看過你的代碼的細節。爲什麼不運行一些測試來確保輸出符合預期? – assylias