2010-07-28 88 views
0

我今天已经发布了一个问题。这个问题是关于同一个项目,但没有关系。我正在开发乐高NXT Mindstorm机器人的应用程序。我有两台机器人和一台运行在PC上的GUI。需要帮助和想法解决收集问题

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

有一大堆GUI和机器人之间以及机器人自身之间的通信。因为这个原因,任何时候我写数据到输出流,似乎有些数据被其他人覆盖,系统工作不正常。

我一直在建议编写一个类,该类将包含一个集合(Queue)对象,以便随时机器人要发送一些东西时,它将它添加到集合(Queue)中,并从该类中持有集合对象,会有一种方法,以便它不断地检查集合,只要它不是空的,它就会将集合中的数据发送到输出流。

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

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

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

我在问,如果有人能帮助我,让我知道如何实现这样的课程。该类中的方法将不时检查集合中是否有数据,并将通过输出流发送它们。在发送时,可能会添加新的元素。

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

欢迎您提出建议。

谢谢。

回答

0

Vector是一件好事,因为(至少在JavaSE的 - 我不知道是什么的Mindstorms使用),它是同步的,所以所有调用都是原子 - 如果另一个线程尝试添加一些矢量当你从它删除,它会阻塞,直到完成,避免数据可能丢失的问题。

或者,你可能想看看在Collections类的synchronization wrappers

或者,你可以通过继承一个标准的队列做自己的实施阻塞队列中。虽然更复杂,但阻塞队列是更好的解决方案,因为它避免了繁忙的等待,您可以重复检查队列,并且每次都将其指示为空。

+1

我会建议组合而不是继承,这是长期的安全。你想确保你的类的_all_公共方法是同步的,但是如果将来超类接口被扩展,那么这个保证就会被破坏。 – 2010-07-28 20:08:46

+0

好点。我认为子类化是Java的阻塞集合所做的,因为它们有一个稍微不同的接口,但仔细观察,我发现它们必须使用组合(或类似)。 – Scott 2010-07-28 21:51:48

+0

感谢您的回复球员 – kap 2010-07-28 23:43:21