Rosqueados Máquinas de Estado em Java
-
19-09-2019 - |
Pergunta
Existe uma maneira de segurar um fio num Estado à espera de mudanças? Quero dizer espera tll algo happend (mudança var, chamada de método, etc ..) talvez ele precisa Usando ouvintes de eventos ou objetos sincronizados / métodos ..
O aproach usual para statemachines como este
que usa um while (true) loop que poderia trabalhar para escolhido rosca do {..} (e não GUI) aplicação mas cant't ser usado com tópicos .. (Pelo menos você quiser usar um núcleo para cada máquina de estado de rosca)
Então, para evitar que a tarefa processador consumir uma simples (e feio) forma é um "verificador periódica", quero dizer a adição de um sono outra idéia é definir um objeto sincronizado e usando espera em vez da suspensão fio
exemplo:
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);
A desvantagem é aumentar a complexidade usando sincronizados ou que qualquer coisa que acontecer dentro TIME_CONST seria invisível
Gostaria de conhecer outras idéias para fazer isso, obrigado!
Solução
Sim, você estaria usando wait
/ notify
. Isso é o que é para.
Ou talvez a sua máquina de estado não precisa ter seu próprio segmento. Outros tópicos poderia chamar um método update
na máquina de estado quando algo interessante acontece.
Outras dicas
Se você especificar um fila de espera máquina de estado em Umple em seguida, o código para isso será gerado para você. Especificando uma máquina de estado umple como enfileirado especificamente cria um segmento que aguarda eventos (chamadas método chamado). Outro código na classe pode acontecer simultaneamente no segmento original (s). A palavra-chave 'fila de espera' deve ser colocado imediatamente antes da definição da máquina de estado.
Consulte http://statemachines.umple.org para obter mais informações sobre como criar máquinas de estado em Umple. Você pode considerar Umple como apenas um pré-processador para Java (e para outros idiomas) neste contexto.
Você também pode usar bloqueio e Condição (Java 1.5+). É como wait/notify
e há um exemplo no javadoc
Tente usar um Cachimbo entre o segmento fonte do evento ea linha FSM encarnação. Isto é suficiente para uma aplicação de rosca 2.