首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程间通信及其可行性

Java线程间通信及其可行性
EN

Stack Overflow用户
提问于 2017-02-23 20:20:16
回答 2查看 215关注 0票数 0

首先,简短地描述一下我的问题。基于simbad模拟器( http://simbad.sourceforge.net/doc.php -对我的问题不重要),我想构建一个部署探索环境的漫游者的系统。这个想法是,这些月球车将避开环境中的障碍物,就像其他月球车一样。让我们称其为模拟。这个模拟中的主要元素当然是月球车、环境和一个中心站,它将控制月球车并向其发送命令。这将在线程上运行。

我想要的是,在另一个线程/进程上,有一个监听器。这将监听从键盘输入的命令,并将它们转换为将由中心站应用于我的模拟的命令。例如,每个rover可能都有一个ID,而我可能希望根据它的id删除一个remover。然后我想写一些类似这样的东西:removerover1,在另一个线程上运行的侦听器将其映射到一个命令,例如调用函数centralStation.removeRobot(id_of_robot)。

实现这一点的最佳方式是什么?基本上,我将有两个线程,一个运行模拟,一个监听命令,centralStation应该是共享资源吗?如何使其成为共享资源(创建一个主服务器,启动中央工作站,然后调用其他两个线程开始执行它们的工作?)?

我想知道这方面的最佳实践是什么,以及如何使其尽可能简单。谢谢您:)

EN

回答 2

Stack Overflow用户

发布于 2017-02-23 20:32:56

一个简单的解决方案是简单地将适当的数据结构“放在”组件之间。

例如,ConcurrentLinkedQueue的实例。这里的想法是:您的“输入”线程将“命令”对象写入该队列;另一个线程查看该队列,当它找到新命令时,将其“应用”到模拟中。

重要的方面是:您确实不希望两个线程以某种方式操作相同的数据。

票数 0
EN

Stack Overflow用户

发布于 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/命令通过侦听器(将在单独的线程中)处理后传递到中央工作站(将在单独的线程中)。

因此,我可能会这样做:在主线程中,启动模拟器,创建一个交换器,并启动两个线程,一个用于中心站,另一个用于侦听器。

代码语言:javascript
复制
    // 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中,您可能要做的第一件事就是向侦听器注册

代码语言:javascript
复制
    //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线程中类似的东西,但不是在开始时

代码语言:javascript
复制
    //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
    }

我同意,我可能有几种方法来实现同样的目标,但这是我想到的。希望它能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42415612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档