关于多线程:在线程之间传递数据,都可以产生,都应该消耗(Java)

Passing data between threads, all can produce, all should consume (Java)

我正在广播服务器上工作,在该服务器上所有客户端都应能够向所有客户端发送广播消息,并且所有客户端都应从任何客户端接收广播。 我正在尝试找出最好的方法是在服务器端实现此方法。 我遇到过BlockingQueue,但是我的理解是,当一个线程调用take()时,它将删除该项目,以便其他线程无法获取数据,并且每个客户端都是生产者或消费者。 。 实施此方法的最佳方法是什么? 每个客户端在服务器端都有一个线程。

谢谢!


看看kryonet项目。我在几个项目中都在使用它,真的很好


这是一个棘手的主题,我真的不建议您自己动手。请改用ActiveMQ或RabbitMQ。这些人整日忙于工作,并且知道自己在做什么。


给每个客户端一个线程安全的队列,并将发送的所有消息插入每个队列。

当不再有客户需要消息时,将自动对其进行垃圾回收。


您需要某种pub-sub机制。从下至上很难用Java实现。我建议您查看一些现有的实现。

对于简单,非持久性的解决方案,您应该查看Guava EventBus。尽管我找不到更多文档,但根据此SO,Spring具有类似于事件总线的功能。最后,如果您喜欢冒险,可以看看Akka事件巴士。

对于持久解决方案,可以使用JMS提供程序(例如ActiveMQ)和主题/用户模式。我在Spring + JMS方面有很好的经验。 Redis还可以执行pub / sub(不是JMS实现!),并且具有分发的优势。我从来没有尝试过,所以我不知道它有多好。