这个线程程序每次都会显示不同的答案

时间:2016-10-10 10:36:00

标签: java multithreading concurrency thread-safety java-threads

这是一个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除数

1 个答案:

答案 0 :(得分:0)

关于您的目标,您的实施可能会遇到问题。由于big_countbig对于两个线程都是通用的,并且在线程尝试修改这些线程时没有任何保护,因此您的程序应该创建错误。

除此之外,你也没有使用2个线程,因为两个线程都在从1到500000进行计算。

由于您的计算逻辑似乎没问题,因此当您尝试使用单线程时,您应该获得所需的输出。

如果你想通过两个线程来做,你可以轻松尝试这个。 (只是为了验证,而不是最好的方式)

  • 您应该拥有big_count1big1big_count2big2。因此,名称以'1'结尾的变量仅由thread1使用,名称以'2'结尾的变量仅由thread2使用。

  • 指定thread1从1到250000进行检查,将thread2指定为250001到500000.

  • join()之后,只需比较big_count1big_count2,即可推断出最终答案。 :))