2016-10-10 56 views
1

這是一個Java程序,可從1-500000查找具有最大除數的數字。此線程程序每次向我顯示不同的答案

public class Medium2 { 
    static int count1 = 1; 
    static int count2 = 1; 
    static int big_count = 0; 
    static int big = 0; 

主要方法

public static void main(String[] args) { 
    Runnable runnable1 = new Runnable() { 
     public void run() { 

實現放在這裏

for (int num = 1; num <= 500000; num++) { 
     for (int i = 2; i <= num; i++) { 
     if (num % i == 0) { //Actual Logic 
      count1++; 
     } 
     } 
     if (count1 > big_count) { 
     big_count = count1; //Number of Divisors 
     big = num; //Largest Number 
     } 
     count1 = 1; 
    } 
    } 
}; 

和線程執行

Thread thread1 = new Thread(runnable1); //Threads 
Thread thread2 = new Thread(runnable1); 
thread1.start(); 
thread2.start(); 
try { 
    thread1.join(); 
    thread2.join(); 
} catch (InterruptedException ie) { 
    ; 
} 
System.out.println("Biggest: " + big + "\nNumber of Divisors for " + big + " = " + big_count); 
    } 
} 

但它給不同的答案每次。實際答案是:498960和200除數

+2

「實際的答案是:」......不,它不是。實際的答案取決於運行,而不取決於你的想法。你會得到不同的結果,因爲每次都有不同的結果 – Stultuske

+4

「but」從哪裏來?你的程序在數據競賽中是膝下的。 –

+0

線程在不同運行時會給出不同的結果 –

回答

0

關於你的目標,你的實現可能有問題。由於big_countbig對於兩個線程都很常見,並且在線程嘗試修改這些線程時沒有任何保護,所以程序應該創建錯誤。

除此之外,你也不能使用2個線程,因爲兩個線程都從1做計算500000

由於您的計算邏輯似乎確定,那麼當您使用單個線程試圖得到您想要的輸出。

如果你想讓它由兩個線程來完成,你可以輕鬆地嘗試這個。 (只是爲了驗證,不是最好的方式)

  • 你應該有big_count1big1big_count2big2。因此,名稱以'1'結尾的變量僅由thread1使用,而名稱以'2'結尾的變量僅由thread2使用。

  • 分配線程1,檢查從1 250000及線程從250001到500000

  • join() S,只是比較big_count1big_count2,那麼你就可以推斷出最後的答案。 :))

相關問題