Для решения задачи был выбран способ нахождения простых чисел в диапозоне. Каждое число диапазона проверяется на возможность деления всеми предшествующими его числами. Основная функция нахождения простых чисел в диапазоне: возвращет набор простых чисел.
public List<Integer> findPrimesInRange() {
List<Integer> primes = new ArrayList<>();
Arrays.stream(range).forEach(
i -> {
if (i > 1) {
if (IntStream.range(2, i).noneMatch(n -> i % n == 0)) {
primes.add(i);
}
}
}
);
return primes;
}
Для создания многопоточного приложения нахождения простых чисел был выбран метод с использованием Futures. Для этого класс PrimeNumbers наследует Callable.
Ниже представлены графики взаимосвязи между количеством тредов и временем нахождения простых чисел в заданном диапазоне.
Из графиков видно, что на большом диапозоне использование тредов в данной задаче оправдано, так как способно значительно увеличить скорость выполнения. При этом, начиная с определённого количества тредов график выходит на плато и всё большее количество тредов уже не улучшает времени.
На графиках ниже видно, что слишком большое количество тредов только ухудшает показатели времени и начинает прослеживаться линейная зависимость. Это связано с затратами времени на создание тредов.
Несмотря на то, что задача нахождения простых чисел довольно тривиальная, на ней очень хорошо видна зависимость времени выполнения программы от количества используемых тредов. Были сделаны выводы, что большое количество тредов ухудшает показатели времени выполнения данной задачи.