2017-02-23 14 views
0

首先,简要描述我的问题。基于simbad模拟器(http://simbad.sourceforge.net/doc.php - 对我的问题不重要),我想建立一个部署探测环境的漫游者的系统。这个想法是,这些漫游车将避开环境以及其他漫游车的障碍物。我们称之为模拟。 这个模拟中的主要元素当然是漫游者,环境和一个控制漫游者并且发送命令的中心站。这将在一个线程上运行。Java间的线程间通信和可行性

我想要的是在另一个线程/进程,有一个监听器。这将监听从键盘输入的命令,并将它们转换为将由中心站在我的模拟中应用的命令。例如,每个流动站都可能有一个ID,我可能想要根据其ID删除一个卸妆。然后,我想写下如下内容:删除漫游器1,在另一个线程上运行的侦听器将其映射到命令,例如调用函数centralStation.removeRobot(id_of_robot)。

实现此目的的最佳方式是什么?基本上我会有2个线程,一个运行模拟,一个监听命令,并且中央站应该是共享资源?我如何使它成为一个共享资源(建立一个主体,启动中心站,然后调用其他两个线程开始执行他们的工作?)?

我想知道最佳做法是什么,以及如何使它尽可能简单。 谢谢:)

+0

让现有的Java工具为您处理线程;请改用[关键侦听器](https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)。那么你只需要一个主线程,而不需要处理锁定等。 –

+0

另外StackOverflow不是用于这些类型的_“是x可能吗?我该怎么做?”_问题 - 此社区是为取而代之的是帮助你解决算法/代码等问题。虽然你的问题写得很好,所以赞赏:) –

回答

0

一个简单的解决方案是简单地在你的组件之间放置一个适当的数据结构。例如,ConcurrentLinkedQueue的实例。这里的想法是:你的“输入”线程将“命令”对象写入该队列;另一个线程查看该队列,并且当它找到一个新的命令时,该命令就被“应用”到模拟中。

重要的方面是:你真的不希望这两个线程在相同数据莫名其妙。

0

那么怎么样的Java器,其中字符串是流动站/命令ID如果我理解它是正确的,那么你要启动系统并在运行时通,你的听众会传送到中心站 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html

流动站ID /命令通过一个监听器(它将在一个单独的线程中)处理后,传送到中央站(它将在一个单独的线程中)。

所以我怎么可能会这样做: 在主线程中,启动模拟器,创建一个Exchanger,并启动两个线程,一个用于中央工作站,另一个用于侦听器。

// 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 
    } 

我同意,可能有几种方法可以实现,但这是我想到的。希望能帮助到你 !