专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 线程通信的几种方式

线程通信的几种方式

更新时间:2022-10-11 09:39:51 来源:动力节点 浏览948次

通信范式

线程有两种主要的通信方式。共享内存和消息传递。

共享内存

所有线程都可以访问相同的内存。他们正在处理不同的数据块,但如果需要,他们可以使用其他人的结果。线程的执行需要同步,尤其是当进行下一步计算时,一个线程需要来自另一个线程的数据。

消息传递

在这种情况下,每个线程都可以发送和接收消息。他们正在使用一个队列来存储消息,直到它被处理。如果我们想获得线程之间的双向通信,建议使用两个队列。队列的长度应根据工作量而定。

工作平衡示例

假设您有 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]。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>