java – 设计这个算法一个更好的方法?

前端之家收集整理的这篇文章主要介绍了java – 设计这个算法一个更好的方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在工作一个更复杂的版本(车辆在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              |
+---------------------------------------------+
原文链接:https://www.f2er.com/java/125085.html

猜你在找的Java相关文章