Estoy trabajando en una versión mucho más compleja de esto (con el vehículo moviéndose en ambas direcciones X e Y)¿Diseñando este algoritmo de una mejor manera?
Hice este ejemplo para obtener ideas sobre mejores formas de lograr esto.
- Tengo un vehículo en movimiento en la dirección X a una velocidad (24.5872 mps)
- Estoy simulando esta incrementando el valor de X cada 100 ms utilizando un ejecutor (para mantener su posición X más precisa y real tiempo)
- Después de cada segundo, envío un mensaje a otro proceso con los valores xMin y xMax de la línea que acabo de cubrir
- El otro proceso responderá con un mensaje JMS (generalmente al instante) indicándome que detenga si hay era un "Bache" en el área X anterior (mensaje de devolución de llamada a una secuencia de bloqueo vinculada).
El problema que tengo es con la parte "por lo general al instante". Si no obtengo una respuesta lo suficientemente rápido, creo que arrojará todo el tiempo de mi algoritmo. ¿Cuál es una mejor manera de manejar esta situación?
Aquí hay un código básico de lo que estoy tratando de hacer:
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
}
}
¿Hay algún motivo por el que esté utilizando un mensaje JMS? –
Interprocess communication – systemoutprintln
Aquí hay una pequeña aceleración en su código: cambie 'currX = incrementor * increment;' a 'currX + = increment;' y configure initialize currX como 'currX = -increment;' Simplemente cambiando a * a a + , pero ahí tienes. –