0

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

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

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

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

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

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

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

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

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

欢迎您提出所有建议。

谢谢。

4

1 回答 1

0

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

或者,您可能想查看Collections 类中的同步包装器。

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

于 2010-07-28T19:55:43.240 回答