Только что протестил один пример, указанный ниже:
public void run() {
long current = 1L;
long max = 20000L;
long numPrimes = 0L;
System.out.printf("Thread '%s': START\n", Thread.currentThread().getName());
for(; current <= max; ++current) {
if (this.isPrime(current)) {
++numPrimes;
}
}
System.out.printf("Thread '%s': END. Number of Primes: %d\n", Thread.currentThread().getName(), numPrimes);
}
private boolean isPrime(long number) {
if (number == 111) {
System.out.println("ИМЯ " + Thread.currentThread().getName() + " " + number);
}
if (number <= 2L) {
return true;
} else {
for(long i = 2L; i < number; ++i) {
if (number % i == 0L) {
return false;
}
}
return true;
}
}
Выполняя заметил, что каждый поток, выполняет участок указанный ниже. То есть получается что каждый поток имеет свою переменную current и каждый из потоков инкрементировал ее. То есть она ThreadSafe. Это для меня стало неожиданностью.
if (number == 111) {
System.out.println("ИМЯ " + Thread.currentThread().getName() + " " + number);
}
И собственно вопросы. Это достигается с помощью this.isPrime(current)? Можно ли утверждать что каждый поток как бы создает собственную current и вызов через this.метод, заставляет все потоки выполнять вычисления, как бы "не пересекаясь"?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости