Многопоточность кода слишком медленная для многих работников, но быстрая для немногих - PullRequest
0 голосов
/ 17 октября 2019

Я написал код для ускорения алгоритма перебора, я решил использовать многопоточность. Хотя я новичок в многопоточности и понимаю, что, создавая большие пулы рабочих (потоков) и распределяя между ними рабочие места, грубая сила должна быть очень быстрой. Ну, мой код ниже работает быстрее с небольшим количеством работников (10 или меньше), но медленнее с большим количеством работников (1000). Почему странное поведение и где ошибка?

ExecutorService executor = Executors.newFixedThreadPool(1000);
            List<Callable<Integer>> callList = new ArrayList<>();
            Callable<Integer> worker;
            for (int i = 0; i < 1000; i++) {
                worker = new WorkerThread(start, end, id);
                Thread.currentThread().setName("Staff  "+i);
                callList.add(worker);
                start = end;
                end = end + addition + 1;
            }
            int result = executor.invokeAny(callList);
            System.out.println("Done Work");

            System.out.println(result);
            executor.shutdownNow();
            executor.awaitTermination(5, TimeUnit.NANOSECONDS);

1 Ответ

2 голосов
/ 17 октября 2019

Чтобы пояснить комментарий Слава, когда вы запускаете процесс параллельно, процессор может параллельно выполнять ограниченное количество. При использовании числа потоков, меньшего или равного числу, имеющемуся в компьютере, процессор может (если не будут выполнены другие задачи) теоретически запускать код одновременно. Тем не менее, выше этого, и процессор должен начать переключаться между потоками, чтобы он выглядел так, как будто программа работает параллельно (когда в действительности она работает последовательно). Это переключение между процессами требует времени (и замедляет программу).

Подробнее об этом читайте о: планировщики и диспетчеры

...