我有一个从套接字服务器读取数据的 Java 进程。因此,我有一个 BufferedReader
和一个与该套接字对应的 PrintWriter
对象。
现在在同一个 java 进程中,我有一个接受客户端连接的多线程 java 服务器。我想实现一种功能,我接受的所有这些客户端都可以从我上面提到的 BufferedReader
对象读取数据。(以便它们可以多路复用数据)
如何让这些单独的客户端线程从 BuffereReader 单个对象读取数据?抱歉造成混淆。
最佳答案
我强烈建议他们不要直接访问BufferedReader
。假设您知道数据的格式,并且每个客户端都试图读取相同的格式(如果不是这种情况,我根本看不出它是如何工作的)我建议创建一个线程来读取 BufferedReader
并将工作项放入 Queue
中。在 Java 中有很多使用生产者/消费者队列的例子,这也可能使测试客户端代码变得更容易。
只有一个线程访问 BufferedReader
意味着您无需担心定义所有其他线程都必须满足的原子操作 - 您的读取线程通过决定有效地定义该操作向队列中添加一个工作项。
编辑:如果所有客户端都应该看到所有 数据,这进一步强化了我的建议,即拥有一个单一的阅读器 - 除了不是拥有数据的 Queue
从中删除了哪些项目,您将拥有一个集合,客户端可以从中读取所有现有数据。您需要使用适当的线程安全集合,但 Java 中有很多这样的集合。
编辑:刚刚阅读了您的评论,其中表示每个客户都应该只看到从读者那里读取的最后一个项目,这使得它变得更加容易。让一个线程读取数据,但只保留一个引用“最后读取的项目”的变量。您可能想要同步访问它或使用 AtomicReference
,但这两者都很简单。
关于java线程间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190895/