服务器访问两种不同类型的线程

时间:2015-12-04 04:37:50

标签: java

我有一个带有2种不同类型线程的msgs服务器,一个从客户端读取,另一个在另一个客户端写入(取决于接收器)......(是的,它必须是这样的,我不能在同一个线程中读/写...)

我基本上需要将所有消息存储在ArrayList(Server ?)中的某个位置,将其保留,直到另一个客户端连接到服务器。

我的问题是:

  

我可以轻松地从Thread中读取对象,但是我无法看到任何方法将对象提取到共享的ArrayList,以便在另一个线程中获取对象。

--->Input Thread ---> ArrayList ---> OutputThread   

1 个答案:

答案 0 :(得分:1)

听起来你真正需要的是一个线程安全的队列,不一定是ArrayList。 BlockingQueue接口专门用于此类事情。您的输入线程可以将消息放入队列,输出线程可以删除它们。如果输出线程尝试从中获取消息时队列为空,则它会自动等待输入线程添加消息。

有许多类实现了BlockingQueue接口,但您可能希望使用以下两种类型之一:

  • ArrayBlockingQueue基于固定大小的数组,因此您必须在构建一个大小时选择一个大小,并且这是队列中可以保留多少项的限制。如果输入线程尝试将消息放入队列时队列已满,则输入线程将等待输出线程删除队列中已有的消息之一。
  • LinkedBlockingQueue并不需要尺寸限制;你可以拥有一个永远不会得到" full"的队列,所以输入线程可以继续输入越来越多的消息,即使输出线程没有足够快地删除它们以保持同步。 (排队太多消息最终会导致OutOfMemoryError。)