我试图将我的大脑围绕并行/并发编程(在 Java 中)并被挂在我一直在阅读的任何教程中似乎没有涵盖的一些基础知识上。
当我们谈论“多线程”或“并行/并发编程”时,这是否意味着我们正在处理一个大问题并将其分散到多个线程上,或者我们是否首先明确地将其分解为更小的子问题,然后通过每个子问题都有自己的线程?
例如,假设我们有EndWorldHungerTask implements Runnable
,并且任务完成了一些巨大的问题。为了完成它的目标,它必须做一些非常繁重的工作,比如一亿次:
public class EndWorldHungerTask implements Runnable {
public void run() {
for(int i = 0; i < 100000000; i++)
someReallyExpensiveOperation();
}
}
为了使这个“并发”或“多线程”,我们是否会将其传递EndWorldHungerTask
给 100 个工作线程(JVM 告诉 100 个工作线程中的每一个何时处于活动状态并在下一次迭代/someReallyExpensiveOperation()
调用中工作),还是我们会手动/显式地重构它,以便 100 个工作人员中的每一个都在循环/待完成工作的不同部分进行迭代?在这两种情况下,100 名工人中的每一个都只迭代了一百万次。
但是,在第一个范例下,Java 告诉每个线程何时执行。第二种情况下,开发者需要提前手动(在代码中)划分问题,并将每个子问题分配给一个新的线程。
我想我在问它在 Java 领域是如何“正常完成”的。而且,不仅针对这个问题,而且总体而言。