Проблема с многопоточностью - JAVA thread.wait() для метода, который необходимо использовать

Я сейчас работаю над роботом. Я использую лего-кирпич EV3. Моя цель — добраться из точки А в точку Б с помощью метода travelTo(x,y) по кратчайшему пути. Этот метод находится в потоке с именем Drive, который содержит все методы, используемые для управления движениями моего робота (turnTo(двойной угол), travel(двойное расстояние), travelTo(двойной x, двойной y), changeSpeed(int newSpeed). ..). У меня есть еще один поток под названием ObstacleAvoidance, который должен остановить поток Drive, если впереди есть препятствие, и начать избегать препятствия, используя технику P Controller, чтобы следовать за препятствием.

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

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


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

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


person Tristan Toupin    schedule 19.11.2016    source источник
comment
Мы говорим о java.lang.Threads здесь? Потому что вы вообще не должны вызывать wait() и notify() для объектов потока.   -  person biziclop    schedule 20.11.2016
comment
Методы находятся на объектах, независимо от того, представляет ли этот объект поток, это не должно мешать его вызову другим потоком. И зачем разделять функциональность на 2 потока, если один должен остановить другой, прежде чем он заработает? Я ничего не знаю о робототехнике, но это заставляет меня задаться вопросом, как все устроено.   -  person Nathan Hughes    schedule 20.11.2016


Ответы (1)


Вы можете прервать поток привода, используя 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 после того, как вычислите, как справиться с препятствием.

person Lord_PedantenStein    schedule 19.11.2016