java - 多线程代码对许多工作人员来说太慢,但对少数工作人员来说速度很快
问题描述
我写了一个代码来加速蛮力算法,我决定使用多线程。虽然我是多线程的新手,但我知道通过创建大量工作人员(线程)并将工作分配给他们,蛮力应该非常快。好吧,我下面的代码在少数工人(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);
解决方案
为了详细说明 Slaw 的评论,当您并行运行一个进程时,处理器实际上可以并行执行的数量有限。当使用的线程数少于或等于计算机的线程数时,处理器理论上可以(如果没有给定其他任务)同时运行代码。但是,在此之上,处理器必须开始在线程之间来回切换,以使其看起来好像程序是并行运行的(实际上,它是按顺序运行的)。进程之间的这种切换需要时间(并且会减慢程序的速度)。
有关这方面的更多信息,请阅读:调度程序和调度程序
推荐阅读
- arrays - wp查询数组中的while循环
- java - JLabel.setText 以一种奇怪的方式工作
- react-native - 反应导航中的抽屉导航在下一页出现之前不会关闭
- react-native - 如何使用 NativeBase 日期选择器
- r - 使用 Tukey 的栅栏函数将行标记为异常值
- javascript - jQuery scrollTop 第一次不滚动
- angular - 如何在 Angular 中使用 getObject 函数(aws / S3)在可观察对象内传递值
- c# - 如何在 EF Core 中实例化 DbContext
- yaml - 为什么 ---(3 个破折号/连字符)在 yaml 文件中?
- html - 如何在 Materialise 中对齐一行上的两个输入文本?