【问题标题】:Need Help And Ideas In Solving A Collection Problem在解决收藏问题时需要帮助和想法
【发布时间】:2010-07-28 19:42:39
【问题描述】:

我今天已经发布了一个问题。这个问题是关于同一个项目但不相关的。我正在为 Lego NXT Mindstorm 机器人开发一个应用程序。我有两个机器人和一个在 PC 上运行的 GUI。

在 leJOS NXJ 中,您只能使用一个输入阅读器。这意味着您不能将 PC 直接连接到两个机器人,让两个机器人直接相互连接。所以这就是我所做的。我已将 PC 直接连接到两个机器人,当两个机器人想要直接通信时,我通过 GUI 发送它们的消息。

GUI 和机器人之间以及机器人本身之间存在大量通信。出于这个原因,每当我将数据写入输出流时,似乎某些数据被其他数据覆盖,并且系统无法正常工作。

我被建议写一个类来保存一个集合(队列)对象,这样无论何时机器人想要发送一些东西,它都会将它添加到集合(队列)中,然后从保存集合对象的那个类中,那里将是一个方法,以便它不断检查集合,只要它不为空,它就会将集合中的数据发送到输出流。

这意味着每当集合中的数据被发送到输出流时,就有可能添加新数据。

有人向我建议使用 ArrayBlockQueue 等。但这些类在机器人使用的 class.jar 文件中不可用。

我在这个 jar 文件中知道的集合类是 Vectors 和 Queue。

我在问是否有人可以通过给我有关如何实现此类的想法来帮助我。类中的方法会不时检查集合中是否有数据,并将它们通过输出流发送。在发送时,可能正在添加新元素。

由于数据是从一个地方发送的,因此没有数据会覆盖另一个地方。在我看来这是个好主意。

欢迎您提出所有建议。

谢谢。

【问题讨论】:

    标签: java outputstream lejos-nxj


    【解决方案1】:

    Vector 很好,因为(至少在 JavaSE 中——我不知道 Mindstorms 使用什么)它是同步的,所以所有调用都是原子的——如果另一个线程在你从 Vector 中删除时尝试向 Vector 添加一些东西,它将阻塞直到您完成,避免数据丢失的问题。

    或者,您可能想查看 Collections 类中的 synchronization wrappers

    或者,您可以通过继承标准队列来实现自己的阻塞队列。虽然更复杂,但阻塞队列是一个更好的解决方案,因为它避免了繁忙的等待,您反复检查队列并且每次都被告知它是空的。

    【讨论】:

    • 我建议组合而不是子类化,从长远来看更安全。您希望确保您的类的所有公共方法都是同步的,但是如果将来扩展超类接口,则该保证将被打破。
    • 好点。我认为子类化是 Java 的阻塞集合所做的,因为它们的接口略有不同,但仔细观察后我发现它们必须使用组合(或类似的)。
    • 不客气。这解决了你的问题吗?如果是这样,请考虑接受它,否则请随时询问更多细节或替代解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多