【问题标题】:sharing data between threads线程间共享数据
【发布时间】:2011-08-29 02:55:19
【问题描述】:

我有一个带有两个不同线程的 java 应用程序,它们执行以下操作:

1.第一个线程(这是一个线程池)- 监听一个端口以获取来自五个不同用户的传入连接。

我们来称呼他们吧:

用户1 用户2 用户3 用户4 用户5

他们每个人都在发送 GPS 数据。

2.第二个线程 同时,我的 Java 应用程序侦听第二个端口,等待另一个客户端(不同于发送 GPS 数据的客户端)连接到它。

现在...我有第二个应用程序连接到我刚刚描述的 java 应用程序。

在第二个应用程序中,我有一个列表 user1...user5,根据我将选择的项目(user1...5),我必须从我选择的用户那里接收正确的数据。 此外,所有这些数据都将存储在数据库中的第二个用户处。

现在谁能告诉我如何在线程之间共享所有这些数据????

我尝试过使用 Singleton 类和 BlockingQ,但似乎这些都不合适,因为数据会丢失!

【问题讨论】:

    标签: java multithreading gps


    【解决方案1】:

    Java 中的并发执行通常依赖于“共享内存”,因此只需确保两个线程中的代码共享对它们可以交换信息的公共数据结构的引用。

    您只需要确保对该结构的访问是以同步/线程安全的方式完成的。这可以通过使用synchronized 关键字(不推荐)或使用java.util.concurrent 包中的类(推荐)手动完成。

    BlockingQueue 可能很适合你。您在尝试这门课时遇到了什么问题?

    问题是从 BlockingQueue 读取的线程需要区分 BlockingQ 中写入的数据(来自 user1,2,3...的数据)。

    我建议您为UserData 创建一个类,其中包含数据及其来自哪个用户。 (并将其存储在 BlockingQueue<UserData> 中。)

    BlockingQ 可以保留多长时间和多少数据????因为所有这些数据都需要存储在我的第二个应用程序的数据库中......所以我可以承受丢失任何数据!!!!!!! !!!!

    BlockingQueue 实际上是一个接口,但它的所有标准实现(ArrayBlockingQueueLinkedBlockingQueue...)都可以保留任意数量的数据(即,仅受可用内存数量的限制)在您的计算机上)。

    【讨论】:

    • 问题是从BlockingQueue读取的线程需要区分BlockingQ中写入的数据(来自user1,2,3的数据...)。这是第一个问题.而第二个问题是-BlockingQ 可以保留多长时间和多少数据????因为所有这些数据都需要存储在我的第二个应用程序的数据库中......所以我可以承受丢失任何数据! !!!!!!!!!
    • @embry 您可以编写一个包装类来包含用户信息和 BlockingQueue 中的数据。您可以将 ArrayBlockingQueue 用于固定长度,也可以将 LinkedBlockingQueue 用于无限大小的队列(当然,仅受 JVM 堆的限制)。
    • @aioobe...你没有关于 BlockingQ 的示例(如果我不问太多的话..),因为我在网上找到的示例非常简单...谢谢你的信息;)
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多