java - Java中由主线程创建的两个线程之间的通信
问题描述
所以我必须创建三个 Teller 线程和 100 个 Client 线程。
每个线程必须遵循一系列动作,打印每个动作的记录。
Teller 线程必须:通知客户端它可用,接受来自客户端的 id 和事务,响应客户端,.. 等等
客户有一组类似的操作:排队等候,收到信号时选择免费柜员等
我不明白的是,我如何让这些线程进行通信?
所以我从 main 方法中做了三个 Teller 线程,100 个客户端线程,我究竟如何将一个客户端线程连接到一个柜员线程?显然当三个柜员线程打开时,它们只能带3个客户端,所以97个其他客户端线程将等待。如何停止客户端的 run() 方法,以便线程在等待打开的柜员时仍然存在?
解决方案
您可以使用倒计时闩锁。
基本上它的工作原理是这样的:如果所有出纳员此刻都忙,倒计时锁存信号有助于让客户端等待,并在信号计数达到 0 时通知客户端线程(这意味着轮到我了)。
我的建议是,为每个客户端创建一个计数等于 1 的倒计时锁存信号,并将它们存储在一个数据结构中(我推荐一个队列),因此每次出纳员处理完客户端后,只需从客户端弹出一个倒计时锁存信号排队,然后将弹出信号的计数减少到 0,以便通知具有此信号的客户端。
我推荐一个队列,因为每次弹出后它都会删除元素,所以没有任何数据竞争(线程同时读取相同的元素,这使得客户端由两个线程提供服务)。
我希望这有帮助。
推荐阅读
- javascript - 如何通过点击 JavaScript 输入文本字段内的十字按钮来刷新我的实时搜索?
- php - 我们如何嵌入 TripAdvisor 评论?
- python - 树莓派:使用 Sense Hat 传感器,如何检测加速度?
- android - 在 CameraImage 流中使用 websocket 时,相机渲染缓慢
- pyspark - Pyspark Phoenix 集成在 oozie 工作流程中失败
- php - 如何计算两个 DateInterval 对象的总和
- r - SMOTE in r 显着减少样本量
- unix - 在 Tcl 脚本中将变量传递给 grep 命令
- cucumber - 黄瓜和测试管理工具
- date - 如何在球拍中循环日期?