Вопрос

Есть ли способ удержать поток в состоянии ожидания изменений?Я имею в виду, подождите, что что -то случилось (изменить вар, метод вызова и т. Д.) Возможно, это необходимо, используя слушатели событий, или синхронизированные объекты/методы.

Обычный подход для таких конечных автоматов

пример конечного автомата

Здесь используется цикл 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.Этого достаточно для двухпоточной реализации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top