Java Thread вопрос по основам

257
05 февраля 2018, 04:54

Только что протестил один пример, указанный ниже:

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.метод, заставляет все потоки выполнять вычисления, как бы "не пересекаясь"?

READ ALSO
не могу зайти на сервера крмп [требует правки]

не могу зайти на сервера крмп [требует правки]

У меня не запускается сервера крмпЧто делать? В ютубе все видео посмотрел нечего не помогает

154
Android Studio вопросы по SurfaceView

Android Studio вопросы по SurfaceView

Пишу программу, которая весь на весь экран рисует сетку квадратовВ каждом квадрате нарисована цифра "0"

231