假設我有三個長度不同的數組。 我想用三個不同的線程對這三個數組進行排序。使用線程無法獲得正確結果
我爲此寫了下面的代碼。所以它寫或發生了什麼錯誤。 有時它給我正確的結果,有時陣列的值與其他數組的值合併:
我添加了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();
}
@DJClayworth我認爲你是對的,也許只是做出答案而不是評論? – MrHug
你使用'synchronized'並不是特別好。事實上,由於顯示器不同,所以沒用。在共享顯示器上同步。 – Ordous