Не уверен, почему вы используете Thread.yield()
- существуют ли другие потоки, которые вы не упомянули? Или, может быть, я неправильно понял проблему.
Я думаю, что здесь может подойти шаблон Command. У вас будет интерфейс RobotCommand
с методом execute
и реализация RobotCommand
для каждого типа команды (go, spin и т. Д.). Тогда вы могли бы создать RobotAlgorithm
как List
из RobotCommand
и иметь метод executeRobotAlgorithm
, который выполняет итерацию по списку, вызывая execute
для каждого RobotCommand
и проверяя результат thingFound()
после каждого один.
Редактировать - О, я думаю, я понял. go
и spin
запускают темы, которые меняют состояние робота, или что-то в этом роде?
Редактировать 2 - в ответ на ваш комментарий звучит так, что проблема в том, что вам нужно иметь возможность немедленно вернуться, если робот найдет то, что он ищет, но go
, spin
, и т. Д. Команды не будут делать это прямо сейчас, и вам нужна возможность продолжать выполнять новые команды в то же время. Итак, что я мог бы сделать, это иметь два потока - один из них был бы потоком-исполнителем, который будет выполнять ваши List
из RobotCommand
-ов, один за другим, и поток-наблюдатель, который будет многократно спать и опрашивать (check thingFound()
). Если thingFound()
когда-либо имеет значение true, тогда вы можете остановить своего робота, а также поток исполнителя, или, если исполнитель завершит работу до того, как thingFound()
станет истиной, тогда он может подать сигнал как таковой (при необходимости).