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

时间:2014-03-03 21:14:17

标签: java multithreading

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

谢谢!

4 个答案:

答案 0 :(得分:0)

你需要某种pub-sub机制。这在Java中很难从下到上实现。我建议你看看一些现有的实现。

对于简单的非持久性解决方案,您应该查看Guava EventBus。根据{{​​3}},Spring有类似事件总线的东西,虽然我找不到更多的文档。最后,如果您有冒险的话,可以查看this SO

对于持久性解决方案,您可以使用JMS提供程序(如ActiveMQ)和主题/订阅者模式。我有很好的Spring + JMS经验。 Redis也可以做pub / sub(不是JMS实现!),它具有分发的优点。我从未尝试过,所以我不知道它有多好。

答案 1 :(得分:0)

为每个客户端提供一个线程安全的队列,并将所有消息发送到每个队列。

当没有客户端需要消息时,它将自动被垃圾收集。

答案 2 :(得分:0)

这是一个棘手的主题,我真的不建议你自己滚动。请改用ActiveMQRabbitMQ。这些人整天都在努力,知道他们在做什么。

答案 3 :(得分:0)

看一下kryonet项目。我在我的几个项目中使用它并且它真的很好