Java 这个线程程序每次都向我显示不同的答案

Java 这个线程程序每次都向我显示不同的答案,java,multithreading,concurrency,thread-safety,java-threads,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

这是一个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;  
    }  
  }  
};  

但每次都会给出不同的答案。实际答案是:498960和200除数

关于您的目标,您的实现可能会有问题。由于
big\u count
big
对于这两个线程都很常见,并且在线程试图修改它们时没有任何保护,因此您的程序应该会产生错误

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

由于您的计算逻辑似乎正常,所以当您尝试使用单线程时,应该会得到所需的输出

如果您希望它由两个线程完成,您可以很容易地尝试这个。(只是为了验证,不是最好的方式)

  • 你应该有
    big_count1
    big1
    big_count2
    big2
    。因此,名称以“1”结尾的变量仅由thread1使用,而名称以“2”结尾的变量仅由thread2使用

  • 将thread1指定为检查范围从1到250000,将thread2指定为检查范围从250001到500000

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


关于您的目标,您的实现可能会有问题。由于
big\u count
big
对于这两个线程都很常见,并且在线程试图修改它们时没有任何保护,因此您的程序应该会产生错误

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

由于您的计算逻辑似乎正常,所以当您尝试使用单线程时,应该会得到所需的输出

如果您希望它由两个线程完成,您可以很容易地尝试这个。(只是为了验证,不是最好的方式)

  • 你应该有
    big_count1
    big1
    big_count2
    big2
    。因此,名称以“1”结尾的变量仅由thread1使用,而名称以“2”结尾的变量仅由thread2使用

  • 将thread1指定为检查范围从1到250000,将thread2指定为检查范围从250001到500000

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


“实际答案是:”。。。不,不是。真正的答案取决于跑步,而不是你的想法。你会得到不同的结果,因为每次都有不同的结果,“但是”从哪里来?你的程序正在进行数据竞赛。线程会在不同的运行中给出不同的结果。问题是什么?这段代码似乎是为了演示多线程竞争条件并每次给出不同的答案而编写的。您特意设计了一个每次都会给出不同结果的程序,所以我不明白您的问题是什么。“实际答案是:“。。。不,不是。真正的答案取决于跑步,而不是你的想法。你会得到不同的结果,因为每次都有不同的结果,“但是”从哪里来?你的程序正在进行数据竞赛。线程会在不同的运行中给出不同的结果。问题是什么?似乎写这段代码是为了演示多线程竞争条件,每次都给出不同的答案。你设计了一个程序,每次都应该给出不同的结果,所以我不明白你的问题是什么。
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); 
  }  
}