gpt4 book ai didi

java - 并发编程是更加网格化还是更加集群化?

转载 作者:行者123 更新时间:2023-11-30 04:48:32 26 4
gpt4 key购买 nike

我正在尝试将我的大脑集中在并行/并发编程(Java)上,并且对一些我读过的任何教程中似乎都没有涵盖的基础知识很感兴趣。

当我们谈论“多线程”或“并行/并发编程”时,这是否意味着我们正在处理一个大问题并将其分散到多个线程上,或者我们首先将其显式分解为更小的子问题,并将每个子问题传递给它自己的线程?

例如,假设我们有 EndWorldHungerTask 实现了 Runnable,并且任务完成了一些巨大的问题。为了完成其目标,它必须做一些非常繁重的工作,例如一亿次:

public class EndWorldHungerTask implements Runnable {

public void run() {
for(int i = 0; i < 100000000; i++)
someReallyExpensiveOperation();
}
}

为了使这个“并发”或“多线程”,我们是否可以将此 EndWorldHungerTask 传递给 100 个工作线程(JVM 告诉这 100 个工作线程中的每一个)积极地进行下一次迭代/someReallyExppressiveOperation() 调用),或者我们手动/显式重构它,以便 100 个工作线程中的每一个都迭代循环/工作的不同部分-做完了?在这两种情况下,100 个工作线程中的每一个都只迭代了一百万次。

但是,在第一个范例下,Java 告诉每个线程何时执行。在第二种情况下,开发人员需要提前手动(在代码中)对问题进行分区,并将每个子问题分配给一个新线程。

我想我是在问它在 java 土地上“通常是如何完成的”。而且,不仅仅是针对这个问题,而是针对一般情况。

最佳答案

I guess I'm asking how its "normally done" in Java land. And, not just for this problem, but in general.

这高度依赖于手头的任务。

Java 中的标准范例是您必须自己将工作分成多个 block 。将这些 block 分布到多个线程/核心是一个单独的问题,并且存在多种模式(队列、线程池等)。

值得注意的是,存在可以自动利用多个核心来并行执行诸如 for 循环之类的框架(例如 OpenMP )。但是,我不知道有任何这样的 Java 框架。

最后,执行大量工作的低级库可能可以利用多个内核。在这种情况下,更高级别的代码可能能够保持单线程,并且仍然受益于多核硬件。一个例子可能是使用 MKL 的数字代码在幕后。

关于java - 并发编程是更加网格化还是更加集群化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10355705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com