2015-06-15 68 views
1

假設我有三個長度不同的數組。 我想用三個不同的線程對這三個數組進行排序。使用線程無法獲得正確結果

我爲此寫了下面的代碼。所以它寫或發生了什麼錯誤。 有時它給我正確的結果,有時陣列的值與其他數組的值合併:

我添加了syncronized顯示方法,再次得到不正確的結果。

public class ThreadDemo implements Runnable { 
    private int[] arr; 
    private String[] s_arr; 

    public ThreadDemo(int arr[]) { 
     this.arr=arr; 
    } 
    @Override 
    public void run() { 
     getSorted(arr); 
     try{ 
      Thread.sleep(2000); 
     }catch(InterruptedException e){ 
      e.printStackTrace(); 
     } 
    } 

    private void getSorted(int[] arr) { 

     for (int i = 0; i < arr.length; i++) { 
      for (int j = 0; j < (arr.length-1) - i; j++) { 
       if (arr[j] > arr[j + 1]) { 
        int temp = arr[j]; 
        arr[j] = arr[j + 1]; 
        arr[j + 1] = temp; 
       } 
      } 
     } 

     display(arr); 
    } 

public static void display(int[] a){ 

     for(int i:a) 
      System.out.print(i+" "); 
     System.out.println(); 

    } 
    public static void main(String[] args) { 
     int arr1[]={8,25,9,12,13,17,1}; 
     int arr2[]={38,2,19,12,3,17,16}; 
     int arr3[]={3,22,9,1,34,17,86}; 
     ThreadDemo demo1=new ThreadDemo(arr1); 
     Thread t1=new Thread(demo1); 
     ThreadDemo demo2=new ThreadDemo(arr2); 
     Thread t2=new Thread(demo2); 
     ThreadDemo demo3=new ThreadDemo(arr3); 
     Thread t3=new Thread(demo3); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 

輸出#1:這裏的值是混合的。

1 8 9 12 13 17 25 
2 3 12 16 17 1 3 9 17 22 34 86 
19 38 

輸出#2:正確

1 8 9 12 13 17 25 
2 3 12 16 17 19 38 
1 3 9 17 22 34 86 

輸出#3:不正確

1 8 9 12 13 17 25 
2 1 3 3 12 9 16 17 17 22 19 38 
34 86 

public static synchronized void display(int[] a){ 

     for(int i:a) 
      System.out.print(i+" "); 
     System.out.println(); 

    } 
+1

@DJClayworth我認爲你是對的,也許只是做出答案而不是評論? – MrHug

+0

你使用'synchronized'並不是特別好。事實上,由於顯示器不同,所以沒用。在共享顯示器上同步。 – Ordous

回答

2

你的陣列可能是正確的順序。但是打印的結果是交錯的,因爲打印出現在不同的線程上。

排序每個線程上的數組,然後在所有線程完成後打印所有結果。

+0

你能否爲此寫一個小代碼,你說的是調用結果。 – Musaddique

+0

@Musaddique你可以看看如何等待一個線程完成。在所有三個線程上執行該操作,然後在'main'方法中對三個數組中的每一個調用'display'。 – DJClayworth

相關問題