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

标签 java

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

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

我的问题是:

I can easily read the object from the Thread, however i can't see any way to extract the object to a shared ArrayList in order to get acess to him in the other thread.

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

最佳答案

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

有许多类实现 BlockingQueue 接口(interface),但您可能需要使用这两个类之一:

  • ArrayBlockingQueue基于固定大小的数组,因此在构造数组时必须选择一个大小,这就是队列中可以容纳的项目数的限制。如果当输入线程尝试将消息放入队列时队列已满,输入线程将等待输出线程删除队列中已有的消息之一。
  • LinkedBlockingQueue不需要大小限制;您可以拥有一个永远不会“满”的队列,因此输入线程可以继续将越来越多的消息放入其中,即使输出线程删除消息的速度不够快以跟上。 (排队太多消息最终可能会导致 OutOfMemoryError。)

关于java - 服务器访问两种不同类型的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34080998/

相关文章:

java - 无法在 AsyncTask 中为 ProgressDialog 调用 Looper.prepare() 的线程内创建处理程序

java - proto3, com.google.protobuf.CodedInputStream.readStringRequireUtf8()Ljava/lang/String;

Java泛型通配符问题

java - Retrofit 所有 api 的可重用方法

java - 将通用列表参数发送到 JAX-RS Web 服务

java - IntelliJ IDEA 2016 : Please choose persistence unit

java - JSF 图像下载,Base64 编码保存到数据库

java - 图片上传到服务器 android httppost

java - 在 ServeltContextListener 中使用外部定义的类

java - 多线程 http 服务器从客户端浏览器获取 GET 和 POST