Эта программа-поток каждый раз показывает мне разные ответы

Это 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 делителей.


person Anu Shibin Joseph Raj    schedule 10.10.2016    source источник
comment
фактический ответ: ... нет, это не так. фактический ответ зависит от пробега, а не от того, что вы думаете. вы получаете разные результаты, потому что каждый раз разные результаты   -  person Stultuske    schedule 10.10.2016
comment
Откуда берется но? Ваша программа по колено в гонках данных.   -  person Marko Topolnik    schedule 10.10.2016
comment
поток будет давать разные результаты при разных запусках   -  person Ketan G    schedule 10.10.2016
comment
Какой вопрос? Кажется, этот код был написан для демонстрации многопоточных условий гонки и каждый раз дает разные ответы.   -  person pcjuzer    schedule 10.10.2016
comment
Вы изо всех сил старались разработать программу, которая каждый раз должна давать разные результаты, поэтому я не понимаю, в чем ваш вопрос.   -  person Peter Lawrey    schedule 10.10.2016
comment
Я просто хочу реализовать программу для нахождения числа с наибольшим делителем в диапазоне 1-500000 и мне нужно реализовать его с помощью многопоточности Но эта программа дает каждый раз разные ответы. Похоже, некоторые потоки прерываются. Как избежать таких ошибок?   -  person Anu Shibin Joseph Raj    schedule 10.10.2016
comment
Я предполагаю, что многопоточность здесь требуется для подхода MapReduce, а не для параллельного выполнения точно таких же вычислений.   -  person bashnesnos    schedule 10.10.2016


Ответы (1)


Что касается вашей цели, ваша реализация, вероятно, должна иметь проблемы. Поскольку big_count и big являются общими для обоих потоков и не имеют никакой защиты, когда потоки пытаются изменить их, ваша программа должна создавать ошибки.

Кроме того, вы также не используете 2 потока, поскольку оба потока выполняют расчет от 1 до 500000.

Поскольку ваша логика вычислений выглядит нормально, вы должны получить желаемый результат при попытке с одним потоком.

Если вы хотите, чтобы это выполнялось двумя потоками, вы можете легко попробовать это. (просто для проверки, не самый лучший способ)

  • У вас должны быть big_count1, big1 и big_count2, big2. Таким образом, переменные, имена которых заканчиваются на «1», используются только потоком 1, а переменные, имена которых заканчиваются на «2», используются только потоком 2.

  • Назначьте thread1 для проверки от 1 до 250000 и thread2 от 250001 до 500000.

  • Через join() с просто сравните big_count1 и big_count2, после чего вы сможете вывести окончательный ответ. :))

person Supun Wijerathne    schedule 11.10.2016