java线程间共享数据

标签 java multithreading thread-safety client

我有一个从套接字服务器读取数据的 Java 进程。因此,我有一个 BufferedReader 和一个与该套接字对应的 PrintWriter 对象。

现在在同一个 java 进程中,我有一个接受客户端连接的多线程 java 服务器。我想实现一种功能,我接受的所有这些客户端都可以从我上面提到的 BufferedReader 对象读取数据。(以便它们可以多路复用数据)

如何让这些单独的客户端线程从 BuffereReader 单个对象读取数据?抱歉造成混淆。

最佳答案

我强烈建议他们不要直接访问BufferedReader。假设您知道数据的格式,并且每个客户端都试图读取相同的格式(如果不是这种情况,我根本看不出它是如何工作的)我建议创建一个线程来读取 BufferedReader 并将工作项放入 Queue 中。在 Java 中有很多使用生产者/消费者队列的例子,这也可能使测试客户端代码变得更容易。

只有一个线程访问 BufferedReader 意味着您无需担心定义所有其他线程都必须满足的原子操作 - 您的读取线程通过决定有效地定义该操作向队列中添加一个工作项。

编辑:如果所有客户端都应该看到所有 数据,这进一步强化了我的建议,即拥有一个单一的阅读器 - 除了不是拥有数据的 Queue从中删除了哪些项目,您将拥有一个集合,客户端可以从中读取所有现有数据。您需要使用适当的线程安全集合,但 Java 中有很多这样的集合。

编辑:刚刚阅读了您的评论,其中表示每个客户都应该只看到从读者那里读取的最后一个项目,这使得它变得更加容易。让一个线程读取数据,但只保留一个引用“最后读取的项目”的变量。您可能想要同步访问它或使用 AtomicReference,但这两者都很简单。

关于java线程间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190895/

相关文章:

c# - 使用naudio动态播放音频文件

multithreading - 如果将互斥量放在条件变量之前,那么有多少个线程如何在条件变量上等待呢?

functional-programming - 在 Erlang 中编程时可以忽略线程安全吗?

Java对象数组——硬件内存缓存的使用

java - 如何从一个 Activity 中找出另一个 Activity 已终止

java - 类型不兼容的问题

java - 在 JSF 中使用构建器模式?

c# - 强制某些代码始终在同一线程上运行

.net - 如何在 finally block 中检测 ThreadAbortException? (。网)

java - 在构造函数中设置父子关系而不泄漏 "this"变量