Резьбовые автоматы на Яве - PullRequest
2 голосов
/ 07 января 2010

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

Обычный подход к государственным машинам, подобным этому

пример состояния машины

Использует цикл do {..} while (true), который может работать для однопоточного (и без GUI) приложения, но он НЕ МОЖЕТ использоваться с потоками. (по крайней мере, вы хотите использовать ядро ​​для каждого конечного автомата)

Таким образом, чтобы избежать этой задачи, потребляющей процессор, простым (и уродливым) способом это «периодическая проверка», я имею в виду добавление сна другая идея - определить синхронизированный объект и использовать ожидание вместо потока Sleep

пример:

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, будет невидимым

Я хотел бы знать другие идеи для этого, спасибо!

Ответы [ 4 ]

5 голосов
/ 07 января 2010

Да, вы будете использовать wait / notify. Вот для чего это.

Или, может быть, ваш конечный автомат не должен иметь свой собственный поток. Другие потоки могут вызывать метод update на конечном компьютере, когда происходит что-то интересное.

2 голосов
/ 15 января 2014

Если вы укажете конечный автомат в очереди в Umple, то для вас будет сгенерирован код для этого. При указании конечного автомата в качестве очереди создается поток, который ожидает события (вызовы именованных методов). Другой код в классе может происходить одновременно в исходном потоке. Ключевое слово 'queued' должно быть помещено непосредственно перед определением конечного автомата.

См. http://statemachines.umple.org для получения дополнительной информации о создании конечных автоматов в Umple. В этом контексте вы можете рассматривать Umple как просто препроцессор для Java (и для других языков).

1 голос
/ 07 января 2010

Попробуйте использовать Pipe между потоком источника события и потоком варианта осуществления FSM. Этого достаточно для двухпоточной реализации.

1 голос
/ 07 января 2010

Вы также можете использовать Lock и Condition (Java 1.5+). Это как wait/notify, и есть пример в Javadoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...