Вам нужна другая стратегия. Ваша текущая стратегия заключается в том, чтобы потоки начали поиск простого числа в currentPrime + 1
. Поскольку каждый поток выполняет одно и то же, это означает, что он будет искать перекрывающиеся области в простых числах. Это неэффективно (дублирующая работа) и приводит к тому, что два или несколько потоков иногда обнаруживают одно и то же простое число.
Лучшая стратегия состоит в том, чтобы каждый поток проверял свой диапазон. Например,
value = atomicInt.addAndGet(1000);
добавляет 1000 к atomicInt
и устанавливает value
в значение atomicInt
непосредственно перед успешным добавлением. Таким образом, вы можете рассматривать value
как начало диапазона из 1000 целых чисел, назначенных текущей нити для поиска.
Еще один совет: посмотрите на Сито Эратосфена , если хотите лучшая производительность.
Я предполагаю, что вы делаете это как домашнее задание или учебное упражнение, поэтому я не буду его кодировать для вас.