2016-10-10 25 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,那么你就可以推断出最后的答案。 :))

相关问题