这个线程程序每次都给我不同的答案

This thread program shows me different answers every time

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

关于你的目标,你的实现应该有问题。由于 big_countbig 对于两个线程都是通用的,并且当线程试图修改它们时没有任何保护,您的程序应该会产生错误。

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

因为你的计算逻辑看起来没问题,当你尝试单线程时你应该得到你想要的输出。

如果你想让它通过两个线程来完成,你可以很容易地试试这个。 (只是为了验证,不是最好的方法)

  • 您应该有 big_count1big1big_count2big2。因此,名称以“1”结尾的变量仅供线程 1 使用,名称以“2”结尾的变量仅供线程 2 使用。

  • 分配线程 1 检查 1 到 250000,线程 2 分配 250001 到 500000。

  • join()之后,再比较big_count1big_count2,就可以推导出最终答案了。 :))