我正在工作一个更复杂的版本(车辆在X和Y方向移动)
我做了这个例子,以获得更好的方法来实现这一点.
>我有一辆车以X方向移动(24.5872公里)
>我通过使用执行器每100ms递增X值来模拟这个(为了保持其X位置更准确和实时)
>每秒之后,我发送一个消息到另一个进程与我刚刚覆盖的行的xMin和xMax值
>另一个进程将响应一个JMS消息(通常是立即)告诉我停止,如果在前一个X区域(消息回调msg到一个linkedblockingqueue)有一个“坑洞”.
我所遇到的问题是“通常即时”的部分.如果我没有得到足够的反应,我认为它将抛弃我的算法的整个时间.什么是更好的方式来处理这种情况?
以下是我要做的一些基本代码:
public class Mover implements MessageHandler { private static final long CAR_UPDATE_RATE_IN_MS = 100; private static double currX = 0; private static double CONSTANT_SPEED_IN_MPS = 24.5872; // 55 mph private static double increment = CONSTANT_SPEED_IN_MPS / (1000 / CAR_UPDATE_RATE_IN_MS); static LinkedBlockingQueue<BaseMessage> messageQueue = new LinkedBlockingQueue<BaseMessage>(); // ms private static int incrementor = 0; public static void main(String[] args) { startMoverExecutor(); } private static void startMoverExecutor() { ScheduledExecutorService mover = Executors.newSingleThreadScheduledExecutor(); mover.scheduleAtFixedRate((new Runnable() { @Override public void run() { currX = incrementor * increment; if (incrementor % (1000 / CAR_UPDATE_RATE_IN_MS) == 0) { System.out.println(currX); sendMessage(currX - CONSTANT_SPEED_IN_MPS,currX); // do something try { messageQueue.poll(1000,TimeUnit.MILLISECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } incrementor++; } }),CAR_UPDATE_RATE_IN_MS,TimeUnit.MILLISECONDS); } @Override public void handleMessage(BaseMessage msg) { messageQueue.add(msg); } protected static void sendMessage(double firstX,double secondX) { // sendMessage here } }
解决方法
我正在提出如上所示的上述算法的更改.
JMS调用其他进程
1A.从发送当前的车辆位置开始.
1B.另一个过程将响应一个JMS消息,其中包含您的车辆位置可见区域中所有“排孔位置”的列表.在客户端保留此列表中的“可见锅孔位置”,以便以下步骤使用.
1C.我们将可视区域定义为车辆的邻近区域,即使使用JMS调用其他过程的(1秒延迟网络延迟),车辆的移动也不应该穿过该区域.
1D.每秒钟后,重复步骤1a和1b,并相对于您的车辆的当前位置替换客户端的锅孔位置列表.
.
车载运动观察员
2A.实施可以接收车辆动作通知的观察者模式.
2B.每次发生事件时,观察员将检查车辆的位置是否与步骤1b中获取的可见孔洞列表中的一个条目相匹配.
2C.如果匹配发现,宾果!你必须停下车.
.
车辆运动
3A.注册step-2a观察员观察车辆的动作
3B.等到你从第1b步到达第一个可见的坑洞列表.
3C.每100毫秒增加X值,开始移动车辆.每次移动时,应通知步骤2a观察者.
.
下图图示:
o - Instance of each pot hole somewhere on map X - Moving vehical . - Path followed by vehical Circle - Visible area of the vehical driver
+---------------------------------------------+ | | | o o | | o | | | | | | _.-''''`-._ | | o,' `. o | |,' o `. | | .' . `. | | | . . | | | | . | o | | | X | | | o \ o / | | \ / | | `.,' | | `-._ _.-' | | `'''' | | | | o | | o | | | | | | o o | +---------------------------------------------+