首页 > 解决方案 > Java中由主线程创建的两个线程之间的通信

问题描述

所以我必须创建三个 Teller 线程和 100 个 Client 线程。

每个线程必须遵循一系列动作,打印每个动作的记录。

Teller 线程必须:通知客户端它可用,接受来自客户端的 id 和事务,响应客户端,.. 等等

客户有一组类似的操作:排队等候,收到信号时选择免费柜员等

我不明白的是,我如何让这些线程进行通信?

所以我从 main 方法中做了三个 Teller 线程,100 个客户端线程,我究竟如何将一个客户端线程连接到一个柜员线程?显然当三个柜员线程打开时,它们只能带3个客户端,所以97个其他客户端线程将等待。如何停止客户端的 run() 方法,以便线程在等待打开的柜员时仍然存在?

标签: javamultithreadingconcurrencysemaphore

解决方案


您可以使用倒计时闩锁

基本上它的工作原理是这样的:如果所有出纳员此刻都忙,倒计时锁存信号有助于让客户端等待,并在信号计数达到 0 时通知客户端线程(这意味着轮到我了)。

我的建议是,为每个客户端创建一个计数等于 1 的倒计时锁存信号,并将它们存储在一个数据结构中(我推荐一个队列),因此每次出纳员处理完客户端后,只需从客户端弹出一个倒计时锁存信号排队,然后将弹出信号的计数减少到 0,以便通知具有此信号的客户端。

我推荐一个队列,因为每次弹出后它都会删除元素,所以没有任何数据竞争(线程同时读取相同的元素,这使得客户端由两个线程提供服务)。

我希望这有帮助。


推荐阅读