Я работаю над гораздо более сложной версией этого (с транспортным средством, движущимся в обоих направлениях X и Y)
Я сделал этот пример, чтобы получить идеи о лучших способах достижения этого.
- У меня есть транспортное средство, движущееся в направлении X со скоростью (24,5872 м / с)
- Я имитирую это, увеличивая значение X каждые 100 мс, используя исполнителя (чтобы сохранить его положение X более точным и в реальном времени)
- Через каждую секунду я отправляю сообщение другому процессу со значениями xMin и xMax строки, которую я только что охватил
- Другой процесс ответит сообщением JMS (обычно мгновенным), сообщающим мне, что нужно остановиться, если в предыдущей X-области была «дыра» (сообщение обратного вызова msg для связанной очереди блокировки).
У меня проблема с «обычно мгновенной» частью. Если я не получу ответ достаточно быстро, я думаю, что он потеряет все время моего алгоритма. Как лучше справиться с этой ситуацией?
Вот некоторый основной код того, что я пытаюсь сделать:
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
}
}