在线程之间共享数据

4
我有一个Java应用程序,其中包含两个不同的线程,分别执行以下操作:
1.第一个线程(线程池) - 监听一个端口,接收来自五个不同用户的连接。
让我们称它们为:
用户1 用户2 用户3 用户4 用户5
每个用户都发送GPS数据。
2.第二个线程
同时,我的Java应用程序还监听第二个端口,等待另一个客户端(与发送GPS数据的客户端不同)连接。
现在...我有一个连接到我刚描述的Java应用程序的第二个应用程序。
在这个第二个应用程序中,我有一个用户1 ... user5列表,根据我选择的哪个项目(user1 ... 5),我必须从我选择的用户接收正确的数据。此外,所有这些数据将存储在DB中的第二个用户中。
现在,有人可以给我一些提示,如何在这些线程之间共享所有这些数据吗?
我尝试使用Singleton类和BlockingQ,但似乎都不合适,因为数据会丢失!
1个回答

5
Java中的并发执行通常依赖于“共享内存”,因此请确保两个线程中的代码共享对一个数据结构的引用,以便它们可以交换信息。
您需要做的就是确保对此结构的访问是同步/线程安全的。这可以通过手动使用`synchronized`关键字(不推荐)或使用`java.util.concurrent`包中的类(推荐)来完成。
`BlockingQueue`可能适合您的需求。您尝试使用此类时遇到了哪些问题?
引用:
读取`BlockingQueue`的线程需要区分写入`BlockingQueue`中的数据(来自用户1、2、3等)。
我建议您为`UserData`创建一个类,其中包含数据和其来源的用户。(并将其存储在`BlockingQueue`中。)
引用:
BlockingQ可以保存多长时间和多少数据?因为所有这些数据都需要在我的第二个应用程序中存储在DB中...我不能失去其中任何部分!
实际上,`BlockingQueue`是一个接口,但是所有标准实现(`ArrayBlockingQueue`,`LinkedBlockingQueue`等)都可以保存任意数量的数据(即受计算机上的可用内存量限制)。

问题在于从BlockingQueue读取的线程需要区分写入BlockingQ的数据(来自用户1、2、3等的数据)。这是第一个问题。第二个问题是- BlockingQ可以保留多长时间和多少数据????因为所有这些数据都需要存储在我的第二个应用程序中的数据库中...所以我不能承受任何损失!!!!! - embry
@embry 你可以编写一个包装类来包含用户信息和 BlockingQueue 中的数据。你可以使用 ArrayBlockingQueue 来实现固定长度,或者使用 LinkedBlockingQueue 来实现无限大小的队列(当然,受 JVM 堆大小的限制)。 - sarumont
@aioobe...你有没有一个例子(如果我不要求太多的话..)使用BlockingQ,因为我在网上找到的例子都很简单...谢谢你的信息;) - embry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接