Потоковые конечные автоматы в Java
-
19-09-2019 - |
Вопрос
Есть ли способ удержать поток в состоянии ожидания изменений?Я имею в виду, подождите, что что -то случилось (изменить вар, метод вызова и т. Д.) Возможно, это необходимо, используя слушатели событий, или синхронизированные объекты/методы.
Обычный подход для таких конечных автоматов
Здесь используется цикл do{..} while(true), который может работать для однопоточного приложения (и без графического интерфейса), но его НЕ МОЖЕТ использовать с потоками.(по крайней мере, вы хотите использовать ядро для каждого многопоточного конечного автомата)
Таким образом, чтобы избежать этой задачи, потребляющей процессор, простой (и уродливой) - «периодическая проверка», я имею в виду, что добавление сна другая идея - определение синхронизированного объекта и использование ожидания вместо потока сна
пример:
do{
Switch(state)
{
case STATE_A:
//..A things
break;
case STATE_B:
//..B things
break;
...
case STATE_Z:
//..Z things
break;
}
// Here! => wait()? Thread.sleep(TIME_CONST)? //Hold and yield
}while(powerOn);
Недостатком является добавление сложности при использовании синхронизации или то, что все, что происходит в течение TIME_CONST, будет невидимым.
Я хотел бы знать другие идеи для этого, спасибо!
Решение
Да, вы бы использовали wait
/notify
.Вот для чего это нужно.
Или, может быть, вашему конечному автомату не нужен собственный поток.Другие потоки могут вызвать update
метод на конечном автомате, когда происходит что-то интересное.
Другие советы
Если вы укажете в очереди конечный автомат в Umple, то для вас будет сгенерирован код для этого.Указание простого конечного автомата как поставленного в очередь специально создает поток, который ожидает событий (вызовов именованных методов).Другой код в классе может выполняться одновременно в исходных потоках.Ключевое слово «в очереди» должно быть помещено непосредственно перед определением конечного автомата.
Видеть http://statemachines.umple.org для получения дополнительной информации о создании конечных автоматов в Umple.В этом контексте вы можете рассматривать Umple просто как препроцессор для Java (и других языков).
Вы также можете использовать Блокировку и Состояние (Ява 1.5+).Это как wait/notify
и в Javadoc есть пример
Попробуйте использовать Трубка между потоком источника событий и потоком реализации FSM.Этого достаточно для двухпоточной реализации.