Многопоточность в Java найти в простом числе занимает больше времени? - PullRequest
0 голосов
/ 18 марта 2020

Я пытался найти решение этой проблемы, но не смог найти его в StackOverflow?

Я просто хочу знать, почему мой многопоточный процессор работает так медленно, что он должен был сделать наоборот.

public class Prime {

    static BufferedWriter writer;
    static DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    public static void main(String[] args) throws IOException {


        System.out.println("Without Thread" + findPrime() + " ms");

        System.out.println("With thread : " + findPrimeWithThreads() + " ms");

    }

    public static long findPrimeWithThreads() {

        Instant start = Instant.now();

        int primaryNumber = 3;
        while (primaryNumber <= 100000) {

            int finalPrimaryNumber = primaryNumber;

            new Thread(() -> {
                multiplicationHelper(finalPrimaryNumber);
            }).start();

            new Thread(() -> {
                multiplicationHelper(finalPrimaryNumber+1);
            }).start();

            primaryNumber+=2;
        }

        return Duration.between(start, Instant.now()).toMillis();

    }

    public static long findPrime() throws IOException {
        Instant instant = Instant.now();

        int primaryNumber = 3;
        while (primaryNumber <= 100000) {

            multiplicationHelper(primaryNumber);

            primaryNumber++;

        }

        return Duration.between(instant, Instant.now()).toMillis();
    }

    public static void multiplicationHelper(int primaryNumber){
        int j = 2;
        boolean isPrime = true;

        while (j <= primaryNumber/2) {
            if (primaryNumber % j == 0) {
                isPrime = false;
                break;
            }
            j++;
        }
        if (isPrime) {
//            System.out.println("PRIME :: " + primaryNumber);
        }
    }

}

Это код и вывод этого кода:

Without Thread497 ms
With thread : 22592 ms

Не могли бы вы уточнить, почему так и Как повысить производительность многопоточности? Я новичок в многопоточном программировании, поэтому я что-то не так делаю в этом?

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

«Поиск простых чисел» является вычисляемой операцией. Естественно, он будет использовать 100% загрузку ЦП, потому что ему никогда не потребуется выполнять ввод / вывод.

Двумя целями «многопоточности» являются: (a) для использования преимуществ нескольких ядер ЦП, и (b) для перекрытия вычислений с вводом / выводом. (И для упрощения выполнения параллельных операций ввода-вывода.)

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

Ваш очень обдуманный дизайн запускает 20 000 потоков!

0 голосов
/ 18 марта 2020

Измените свою функцию ниже на

public static long findPrimeWithThreads() {

        Instant start = Instant.now();

        int primaryNumber = 3;
        ExecutorService pool = Executors.newFixedThreadPool(4); // considering you've 4 CPU
        while (primaryNumber <= 100000) {
            int finalPrimaryNumber = primaryNumber;
            pool.submit(()->multiplicationHelper(finalPrimaryNumber));
            primaryNumber ++;
        }
        pool.shutdown(); // stop your threads
        return Duration.between(start, Instant.now()).toMillis();

    }
...