更新时间:2022-10-11 09:39:51 来源:极悦 浏览1150次
线程有两种主要的通信方式。共享内存和消息传递。
所有线程都可以访问相同的内存。他们正在处理不同的数据块,但如果需要,他们可以使用其他人的结果。线程的执行需要同步,尤其是当进行下一步计算时,一个线程需要来自另一个线程的数据。
在这种情况下,每个线程都可以发送和接收消息。他们正在使用一个队列来存储消息,直到它被处理。如果我们想获得线程之间的双向通信,建议使用两个队列。队列的长度应根据工作量而定。
假设您有 100 个线程(T0、T1、T2、...、T99),我们想要检测 [1, 100 000] 范围内的素数。我该如何解决这个问题?
首先,我应该尝试创建一个函数来告诉我一个数字是否是素数。
bool isPrime(int n) {
bool prime = true;
如果(n == 0 || n == 1){
素数= 假;
}
else {
for (int i = 2; i <= n / 2; ++i) {
if (n % i == 0) {
prime = false;
休息;
}
}
}
返回素数;
}
假设您有 100 个线程(T0、T1、T2、...、T99),我们想要检测 [1, 100 000] 范围内的素数。我该如何解决这个问题?
首先,我应该尝试创建一个函数来告诉我一个数字是否是素数。
我们如何将 1 到 100 000 的数字映射到我们的 100 个线程?
每个线程应该解决一大块 1000 个数字。
映射 1:T0 计算来自 [1, 1000]、T1 - [1001, 2000] 等的数字。
映射2:我们按顺序给每个线程一个数字。在第一次迭代中,来自 [1, 100] 的数字,第二次迭代 [101, 200] 等。线程 T1 将计算 [1, 101, 201, ...]。
第二个映射更好,因为所有线程的数字都来自相同的值范围,并且工作负载是平衡的。在第一种情况下,T0 要做的事情较少,来自 [1,1000] 的数字和 T99 的数字很大 [90 001, 100 000]。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习