2016-11-19 7 views
1

В настоящее время я работаю над роботом. Я использую кирпич EVO lego. Моя цель - переместиться из точки A в B, используя метод travelTo (x, y), используя кратчайший путь. Этот метод находится в названии потока Drive, в котором содержатся все методы, используемые для управления перемещениями моего робота (turnTo (двойной угол), перемещение (двойное расстояние), travelTo (double x, double y), changeSpeed ​​(int newSpeed). ..). У меня есть еще один поток под названием ObstacleAvoidance, который должен остановить поток Drive, если есть препятствие впереди, и начать избегать препятствия, используя метод P Controller, чтобы следовать за препятствием.Проблема многопоточности - метод JAVA thread.wait(), который должен использоваться

Моя проблема в том, что мой контроллер P использует методы внутри Thread Drive. Поэтому, когда я вижу препятствие, я не могу:

if (obstacle){  
    Drive.wait(); 
    while(isAvoiding){ 
    pControler(); 
    } 
} 
Drive.Notify(); 


private void pController(){ 
    //use methods inside the DriveThread 
} 

Как я могу обойти эту проблему? Другими словами, как я могу остановить текущее действие моего робота, избежать блока, а затем продолжить то, что я делаю?

+0

Мы говорим о 'java.lang.Thread здесь? Потому что вы не должны называть 'wait()' и 'notify()' на объектах потоков вообще. – biziclop

+1

Методы на объектах, независимо от того, представляет ли этот объект поток, не должен останавливать его от neing, вызванного другим потоком. И зачем расщеплять функциональность на 2 потока, если нужно остановить другую, прежде чем она сможет работать? Я ничего не знаю о робототехнике, но это заставляет меня задаться вопросом, как все организовано. –

ответ

0

Вы можете прервать поток накопителя с помощью Thread.interrupt(), если препятствие находится на пути. Затем вы можете вычислить, как справиться с препятствием, а затем снова диск.

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--

Вы должны поймать https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html в потоке Drive и решить, что делать потом. Поскольку я не знаю, как работает ваш робот, я бы рекомендовал просто остановить поток. Вы можете начать еще одну угрозу с Диском после вычисления того, как справиться с препятствием.