首先,简短地描述一下我的问题。基于simbad模拟器( http://simbad.sourceforge.net/doc.php -对我的问题不重要),我想构建一个部署探索环境的漫游者的系统。这个想法是,这些月球车将避开环境中的障碍物,就像其他月球车一样。让我们称其为模拟。这个模拟中的主要元素当然是月球车、环境和一个中心站,它将控制月球车并向其发送命令。这将在线程上运行。
我想要的是,在另一个线程/进程上,有一个监听器。这将监听从键盘输入的命令,并将它们转换为将由中心站应用于我的模拟的命令。例如,每个rover可能都有一个ID,而我可能希望根据它的id删除一个remover。然后我想写一些类似这样的东西:removerover1,在另一个线程上运行的侦听器将其映射到一个命令,例如调用函数centralStation.removeRobot(id_of_robot)。
实现这一点的最佳方式是什么?基本上,我将有两个线程,一个运行模拟,一个监听命令,centralStation应该是共享资源吗?如何使其成为共享资源(创建一个主服务器,启动中央工作站,然后调用其他两个线程开始执行它们的工作?)?
我想知道这方面的最佳实践是什么,以及如何使其尽可能简单。谢谢您:)
发布于 2017-02-23 20:32:56
一个简单的解决方案是简单地将适当的数据结构“放在”组件之间。
例如,ConcurrentLinkedQueue的实例。这里的想法是:您的“输入”线程将“命令”对象写入该队列;另一个线程查看该队列,当它找到新命令时,将其“应用”到模拟中。
重要的方面是:您确实不希望两个线程以某种方式操作相同的数据。
发布于 2017-02-23 22:38:18
那么Java Exchanger如何呢,其中String是侦听器将传输到中央站https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html的rover/命令的id
如果我理解正确的话,那么您希望启动系统,并在运行时将rover id/命令通过侦听器(将在单独的线程中)处理后传递到中央工作站(将在单独的线程中)。
因此,我可能会这样做:在主线程中,启动模拟器,创建一个交换器,并启动两个线程,一个用于中心站,另一个用于侦听器。
// pseudocode for main
main() {
// start simulator ( I am not sure what this thing is)
Exchanger<String> exc = new Exchanger<String>();
new CentralStationThread(exc);
new CommandListenerThread(exc);
}现在,在CentralStationThread中,您可能要做的第一件事就是向侦听器注册
//pseudocode for run method of central station
public void run(){
String roverIdToStop = exc.exchange(new String);
// some code to trigger the rover stop
// send in replacement rover
}和CommandListenerThread线程中类似的东西,但不是在开始时
//pseudocode for run method of listener
public void run(){
// Listen to keyboard
// String roverIdOrCommand = Parse the command & make something out out it
// when the command is ready to be sent to central station do following
String roverIdToStop = exc.exchange(roverIdOrCommand);
// keep looking for further commands
}我同意,我可能有几种方法来实现同样的目标,但这是我想到的。希望它能帮上忙!
https://stackoverflow.com/questions/42415612
复制相似问题