2013-04-05 32 views
-5

我有一個程序,實現兩種不同的排序算法。我通過在不同的線程中啓動它們來並行測試兩種算法。我希望能夠查看排序操作的結果,因爲它們發生在每個線程中,並且試圖將這些結果保留在同一行(針對每個線程)。如何創建單獨的輸出行,取決於輸出來自的線程?

例:

ARR1 = 3 5 8 11 16 ...(從線程1輸出排序)
ARR2 = 4 7 9 10 17 ...

(從螺紋2輸出排序)

在主邏輯運行後,我已經用Thread.sleep(xxx)完成了這個工作,但是這隻在我只有一個線程時才起作用。如果我把這個延遲兩個線程它顯示是這樣的:

ARR1 =
ARR2 = ARR1 [I] ARR2 [I] ARR1 [I + 1] ARR2 [I + 2] ...

換句話說,兩種排序的輸出都顯示在同一行上。

這裏是我的代碼:

import java.util.PriorityQueue; 

class sortareBubbleSort extends Thread { 
    int nre, min, max; 

    public sortareBubbleSort(int nre, int min, int max) { 
     this.nre = nre; 
     this.min = min; 
     this.max = max; 
    } 

    public void run() { 
     int[] x = new int[nre]; 
     for (int i = 0; i < x.length - 1; i++) 
      x[i] = min + (int) (Math.random() * ((max - min) + 1)); 
     boolean doMore = true; 
     while (doMore) { 
      doMore = false; 
      for (int i = 0; i < x.length - 1; i++) { 
       if (x[i] > x[i + 1]) { 
        int temp = x[i]; 
        x[i] = x[i + 1]; 
        x[i + 1] = temp; 
        doMore = true; 

       } 
      } 
     } 

     System.out.println("\nHere is the sorted array with BubbleSort:"); 
     for (int i = 0; i < x.length; i++) 
      System.out.print(x[i] + " "); 
     System.out.print("\n"); 

    } 
} 

class sortareHeapSort extends Thread { 
    int nre, min, max; 

    public sortareHeapSort(int nre, int min, int max) { 
     this.nre = nre; 
     this.min = min; 
     this.max = max; 
    } 

    public void run() { 
     int[] x = new int[nre]; 
     for (int i = 0; i < x.length - 1; i++) 
      x[i] = min + (int) (Math.random() * ((max - min) + 1)); 

     PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(); 
     for (int w : x) 
      pQueue.add(w); 
     for (int k = 0; k < x.length; k++) 
      x[k] = pQueue.poll(); 

     // Print the array 
     System.out.println("\nHere is the sorted array with HeapSort:"); 
     for (int w : x) 
      System.out.print(w + " "); 
    } 
} 

public class TestThread { 
    public static void main(String args[]) { 
     sortareBubbleSort fir1; 
     sortareHeapSort fir2; 
     fir1 = new sortareBubbleSort(10, 1, 100); 
     fir2 = new sortareHeapSort(10, 100, 200); 
     fir1.start(); 
     fir2.start(); 
    } 
} 

任何幫助或指導讚賞,感謝。

+0

@ Mr.Cool我認爲,他的確有其他意義。 – Adrian 2013-04-05 12:10:07

+0

將整個輸出構建爲一個字符串,並使用某個記錄器(例如帶有Logback的Slf4J)讓它打印。 – Adrian 2013-04-05 12:11:15

+1

不幸的是,您無法控制典型的控制檯設備。你將不得不實現你自己的'輸出'控制檯,它知道線程源,並可以將它們各自的輸出分離爲專用的'行'。我質疑這樣做的重要性,與實施它所需的努力有關。 – Perception 2013-04-05 12:12:45

回答

2

嘗試創建一個同步靜態方法來打印數組,因此完成其作業的第一個線程獲取該鎖並僅在打印整個數組時纔將其釋放。

1

你爲什麼不單獨列打印,而不是行:

Bubblesort Heapsort 
3    
       4 
5    
8 
       7 
11    
       9 
16 
       10 
       17 

這將是更容易實現,只是打印上新的一行中的結果和調整取決於排序算法的壓痕。