Pregunta

¿Hay una manera de sostener un hilo en un estado de espera para los cambios? Me refiero a esperar algo acaecer TLL (var cambio, el método de llamada, etc ..) quizás que necesita el uso de detectores de eventos, u objetos sincronizados / métodos ..

El abordaje habitual para statemachines como este

StateMachine ejemplo

que utiliza un do .. {} while (true) bucle que podría funcionar para sencillo roscado (y sin GUI) pero cant't usarse con hilos .. (Al menos que desee utilizar un núcleo para cada máquina de estado roscado)

Así que para evitar que la tarea del procesador que consume una manera sencilla (y feo) es un "corrector periódica", me refiero a la adición de un sueño otra idea es la definición de un objeto sincronizado y el uso de espera en lugar de Sleep hilo

ejemplo:

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);

El inconveniente es la adición de complejidad usando sincronizado o que cualquier cosa que ocurra dentro de TIME_CONST sería invisible

Me gustaría conocer otras ideas para hacer esto, gracias!

¿Fue útil?

Solución

Sí, se estaría utilizando wait / notify. Eso es lo que es para.

O tal vez su máquina de estados no necesita tener su propio hilo. Otros temas podrían llamar a un método update en la máquina de estado cuando sucede algo interesante.

Otros consejos

Si especifica un en cola en la máquina de estados Umple entonces el código para esto se generará para usted. Especificación de una máquina de estados en cola como umple específicamente crea un hilo que espera a eventos (llamadas a métodos con nombre). Otro código de la clase puede ocurrir al mismo tiempo en el hilo original (s). La palabra clave 'en cola' se debe colocar justo antes de la definición de la máquina de estados.

http://statemachines.umple.org para obtener más información sobre la creación de máquinas de estado en Umple. Se puede considerar Umple sólo como un preprocesador para Java (y para otros idiomas) en este contexto.

También puede utilizar Bloqueo y Condición (Java 1.5 +). Es como wait/notify y hay un ejemplo en el javadoc

Trate de usar un Pipe entre la rosca de origen de evento y el hilo realización FSM. Esto es suficiente para una implementación 2 roscado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top