Programa de flujo único (Single-Thread), es aquel que utiliza como único flujo de
control para controlar su ejecución. La sincronización entre múltiples partes de un
programa se lleva a cabo mediante un bucle de suceso único. Existen ocasiones
en las que dos o más hilos pueden intentar acceder a los mismos recursos y/o
datos. Esta misma situación en un contexto computacional podría darse cuando
dos hilos quieren acceder a un mismo archivo para escribir información, o bien
cuando dos hilos acceden a una misma conexión de base de datos: uno podría
estar ejecutando sentencias update mientras el otro podría ejecutar el “commit” y
dejar en firme las sentencias que ejecutó el primero y que, aún, no estaban
verificadas.
El modificador “synchronized” aplicado a la declaración de un método garantiza
que este será ejecutado por un único thread a la vez.
Creación y control de hilos
Las técnicas para crear un “Thread”.
una es: Heredar de una clase java.lang.Thread y sobrescribir el método “Run()”.
La otra es implementar la interfaz java.lang.Thread pasándole el objeto que
implementa java.lang.Runnable como parámetro.
La creación de un hilo se realiza creando un objeto de tipo Thread java define dos
formas de hacer esto, una es implementar la interfaz Runnable y la otra es
extendiendio la clase tread
La implementación de un de la interfaz Runnable, un Hilo puede ser creado sobre
cualquier objeto que implemente la interfaz, una clase solo tiene que implementar
un solo método llamado run() cuya declaración es la siguiente: public abstract
void run(), después es necesario crear un objeto del tipo Thread dentro de esa
clase.
Thread (Runnable objeto-Hilo, String Nombre-Hilo)
Una vez creado el nuevo hilo, no inicia su ejecución hasta que se llame al método
start()
Synchronized void Start()
En un programa multihilo el hilo principal debe ser el ultimo que finalice su
ejecución. Si el hilo principal finaliza antes de que un hilo hijo, entonces el
interprete de java puede “bloquearse”
Un hilo cambia al estado bloqueado cuando intenta realizar una tarea que no
puede completarse de manera inmediata y debe esperar temporalmente hasta que
este completo. Si un hilo que encuentra código que no puede ser ejecutado aún
debe llamar al método Wait() para cambiar al estado en espera.
Un programa multihilo puede crear tantos hilos como lo requiera, en la
programación de un multihilo es importante que el hilo principal termine su
ejecución el resto de los hilos. Java provee dos métodos para determinar si un hilo
ha terminado su ejecución.
isAlive()
join()
Sincronización de hilos
Cuando dos o más hilo necesitan acceder de manera simultánea a un recurso
compartido necesitan asegurarse de que solo uno de ellos accede al mismo en un
instante dado el proceso mediante el cual se consigue esto se llama
sincronización
La sincronización de código puede realizarse de dos maneras diferentes
Con métodos sincronizados
Con el uso de la instrucción sinchronized
Para la comunicación entre hilos, el uso de monitores implícitos en objetos Java es
bastante potente, pero hay un nivel más de control que se puede conseguir con la
comunicación entre procesos.
Las reglas de utilización son estas:
Wait() le indica al hilo en curso que abandone el monitor que se valla a dormir
hasta que otro hilo entre en el mismo monitor y llama a notify().
Notify() despierta al primer hilo que hizo una llamada a wait() sobre el mismo
objeto
Notify All() despierta a todos los hilos que realizaron una llamada a wait() sobre el
mismo objeto. El hilo con mayor prioridad entre los que han sido despertados es el
primero en ejecutarse
Para asegurarse de que hilos concurrentes no se estorban y operan
correctamente con datos compartidos, un sistema estable previene la inanición y
el punto puerto o interbloqueo