mai*_*rgs 10 java algorithm ipc
我正在研究一个更复杂的版本(车辆在X和Y方向上移动)
我做了这个例子来获得有关实现这一目标的更好方法的想法.
我遇到的问题是"通常是即时"部分.如果我没有足够快地得到响应,我认为它会摒弃我的算法的整个时间.处理这种情况的更好方法是什么?
以下是我要做的一些基本代码:
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++;
}
}), 0, 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
}
}
Run Code Online (Sandbox Code Playgroud)
我建议对上面的算法进行更改,如下面的步骤所示.
JMS调用其他进程
1A.首先发送车辆的当前位置.
1B.另一个过程将使用JMS消息进行响应,该消息包含车辆位置可见区域中所有"Pot hole位置"的列表.在客户端保留此"可见的坑洞位置"列表,以供以下步骤使用.
1C.我们将可见区域定义为车辆的邻近区域,使得即使使用JMS调用其他过程的(1秒延迟+网络滞后),车辆的移动也不应越过该区域.
1D.每隔一秒后,重复步骤1a和1b,并在客户端替换相对于您车辆当前位置的坑洞位置列表.
.
车辆运动观察员
2A.实现观察者模式,可以接收车辆运动的通知.
2B.每次生成事件时,观察者将检查车辆的位置是否与步骤1b中获取的可见坑洞列表中的一个条目相匹配.
2C.如果找到匹配,宾果游戏!你必须停止车辆.
.
车辆运动
3A.注册步骤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 |
+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)