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

这是一个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  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进行计算。

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

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

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

  • 分配thread1以检查1到250000,将thread2分配给250001到500000。

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