首页 > 解决方案 > 多线程代码对许多工作人员来说太慢,但对少数工作人员来说速度很快

问题描述

我写了一个代码来加速蛮力算法,我决定使用多线程。虽然我是多线程的新手,但我知道通过创建大量工作人员(线程)并将工作分配给他们,蛮力应该非常快。好吧,我下面的代码在少数工人(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);

标签: javamultithreadingperformanceconcurrencybrute-force

解决方案


为了详细说明 Slaw 的评论,当您并行运行一个进程时,处理器实际上可以并行执行的数量有限。当使用的线程数少于或等于计算机的线程数时,处理器理论上可以(如果没有给定其他任务)同时运行代码。但是,在此之上,处理器必须开始在线程之间来回切换,以使其看起来好像程序是并行运行的(实际上,它是按顺序运行的)。进程之间的这种切换需要时间(并且会减慢程序的速度)。

有关这方面的更多信息,请阅读:调度程序和调度程序


推荐阅读