2009-02-14 20 views
6

¿Cómo se sincronizaría un subproceso en tiempo real con un subproceso normal en Java? Tomemos, por ejemplo, un hilo en tiempo real que calcula algunas temperaturas y el hilo de la GUI que tiene que recoger esos números y mostrarlos en algunos controles.Sincronización de subprocesos en tiempo real con subprocesos normales

La implementación de la biblioteca en tiempo real no debería importar ya que debe seguir las especificaciones.

Respuesta

4

Vas a necesitar dos cosas. Desea que su subproceso en tiempo real tenga prioridad, y preferiblemente lo haga funcionar con un temporizador para que pueda obtener mediciones (casi) periódicas. Entonces, vas a querer un recurso que pueda usarse para comunicar los valores. Eso puede ser un monitor simple, con una sección crítica para que el subproceso del temporizador pueda escribir en él, o podría ser, y muy probablemente sería mejor, un FIFO, de modo que el subproceso de la GUI pueda consumir valores siempre que tiene ciclos.

En Java, la GUI (al menos en Swing y similar) ya está ejecutando un hilo separado para las interacciones de la UI, por lo que su gran problema es configurar su hilo de medición. Eche un vistazo a Runnables.

2

Para usar subprocesos en tiempo real necesita Java en tiempo real en el sistema operativo en tiempo real. http://java.sun.com/javase/technologies/realtime/index.jsp

Sin embargo, si tiene un hilo sensible a la latencia, le sugiero que lo haga;

  • utilizan las bibliotecas de concurrencia en las comunicaciones con otros hilos.
  • minimizar cualquier actividad GC (ESP completa GC)
  • no corren el hilo en el mismo proceso como una interfaz gráfica de usuario si se puede (ya que suele tomar una gran cantidad de recursos de manera que haya un control limitado sobre)
2

Como otros mencionaron RTSJ, comentaré que la sincronización entre el código en tiempo real y el código no en tiempo real tiene una serie de soluciones. RTSJ proporciona wait-free queues para dicha comunicación. También es posible construir sobre estas u otras colas y hacer uso de las abstracciones de RTSJ AsyncEvent y AsyncEventHandler para gestionar la comunicación. Esto es apropiado para situaciones en las que realmente, realmente, se necesita un comportamiento determinista para el hilo "en tiempo real".

Si puede aceptar el comportamiento de mejor esfuerzo (intente con todas sus fuerzas cumplir sus plazos, pero el mundo no se derrumba si falla), sugiero construir cuidadosamente en el marco ejecutor provisto por the Java concurrency utilities. Una cuidadosa selección de límites de tareas, una política de colas adecuada (en este caso, "adecuada" dependerá de más detalles sobre su aplicación de los que ha proporcionado), y la política de subprocesos obtendrá lo que necesita.

Cuestiones relacionadas