Está en la página 1de 9

Tutorial:

Thread
Sincronizaci
n
Norman Salvador Aruz Lpez
-

Nota: El presente tutorial asume que usted ya sabe cmo crear, agregar
controles, formularios etc. a una aplicacin desde cero. Si usted no
maneja estas temticas se recomienda primero realizar los
tutoriales anteriores, y practicar continuamente para dominio de la
sintaxis.
En tutoriales anteriores aprendimos como pasar datos entre formularios,
esta vez dentro del tema de los hilos aprenderemos que un hilo compite por
el uso del procesador, por lo cual es importante sincronizar los procesos con
el objetivo de que las tareas se ejecuten en un orden debido.

Para ello haremos uso de las clases y de la impresin en consola. La idea


ser sencilla tendremos 5 hilos que querrn acceder a cambiar e imprimir el
valor de una variable contador y por la falta de sincronizacin iniciarn unas
condiciones de concurrencia, por lo cual los valores no saldrn en orden,
crearemos en cada hilo un for que har tres repeticiones cada uno, es decir,
el contador ir de 0 a 14, contando as 15 valores, sin embargo quienes
accedan al aumento del contador lo har en orden aleatorio.
Demostracin de la concurrencia
La concurrencia significa condicin de competencia, esto significa que
aunque los hilos se creen y ejecuten en momentos diferentes en algn
momento compiten por el uso del procesador y se solapan entre s, es decir
aunque cresemos el hilo A y el hilo B por separado ambos estarn en una
cola de procesamiento y no se sabr cual es primero y cual despus,
haciendo que la ejecucin parezca una sola, mostrando los resultados en
desorden.
A continuacin, para ilustrar este caso crearemos una clase llamada
HilosConcurrencia en la cual crearemos 5 hilos, cada hilo realiza la misma
tarea, y compite por el acceso a una sola variable, como veremos la
competencia por acceder a la variable se realiza en orden aleatorio por lo
cual se requerir sincronizar las tareas para controlar el flujo y ejecucin de
los hilos.
Recuerda, para crear una clase debes ir al panel izquierdo click derecho
sobre el paquete ->nuevo->clase de java; y la nombras.
Luego, al inicio de la clase agregaremos la siguiente lnea de cdigo:

Como vemos hemos agregado una variable pblica de tipo entero llamada
contador la cual ser accedida por todos los hilos que cambiarn su valor y
la imprimirn para poder observar la aleatoriedad con la que se ejecutan las
tareas cuando se trabaja con hilos.
El siguiente paso ser crear el primer hilo, para lo cual crearemos una clase
privada dentro de nuestra clase HilosConcurrencia que extiende de la
clase Thread que nos permitir hacer uso de hilos.

El cdigo es el siguiente:

Como puedes ver en la imagen anterior hemos creado un mtodo dentro de


nuestra clase llamado run() el cual se ejecutar cuando llamemos al hilo,
adems dentro del mtodo run() hemos impreso un rtulo que indica que el
primer hilo ha comenzado, luego dentro del ciclo accedemos a la variable
pblica contador que hemos creado al inicio de la clase aumentando su
valor de uno en uno durante 3 iteraciones que es como hemos programado
el nuestro ciclo for, esta variable aumentar de valor y se ir imprimiendo
de uno en uno.
En la lnea del Thread.sleep(); se puede ver que el IDE marca un error, este
los solucionaremos utilizando el asistente de cdigo que trae por defecto
haciendo click en el cono de la izquierda que en donde agregaremos un try
catch a la declaracin:

Listo! Como la funcionalidad de los dems hilos ser la misma, simplemente


copiaremos el cdigo anterior y pegaremos cambiando uno a uno los
nombres de los hilos y los rtulos que ste imprime:
Segundo Hilo

Tercer Hilo

Cuarto Hilo

Quinto Hilo

Listo, ya tenemos declarado que tareas realizarn los hilos que crearemos
en los pasos posteriores, por lo pronto, har falta declarar dentro de la clase
principal un mtodo principal (main). Este mtodo se declara en la clase
principal (HilosConcurrencia), ten cuidado de no ponerlo dentro de las
clases hilos que acabamos de crear.
El primer mtodo que se ejecutar al correr la aplicacin ser el main, por
tanto aqu escribiremos un objeto que se crea a partir de la clase principal.
Puedes utilizar el bloque de cdigo a continuacin:

Ahora, para crear los hilos correspondientes necesitamos crear un mtodo


constructor, lo haremos al inicio de la clase, despus de la declaracin de la
variable global contador, de la siguiente manera:

Luego crearemos en memoria los hilos

Posteriormente los iniciaremos todos al mismo tiempo:

Listo, despus de esto correremos el programa y el resultado ser que los


hilos acceden a la variable en diferente orden, puedes probar el programa
varias veces puesto que en cada corrida la salida es diferente:
Corrida 1

Corrida 2

Como puedes ver las salidas indican que los hilos acceden en un orden
aleatorio al recurso solicitado, a esto se le llama condicin de competencia,
los procesos siguen un orden diferente cada vez que el programa vuelve a
ejecutarse, por tanto la salida nunca es igual.

Para corregir esto agregaremos las siguientes lneas de cdigo a nuestro


programa:
Uso de Join()
Join es un mtodo que permite la sincronizacin entre hilos, es decir el hilo
que est accediendo a la variable deber terminar de ejecutarse para dar
lugar al siguiente hilo quien tendr que ejecutarse completo para poder
pasar al siguiente, de esta manera todos accedern al recurso y el orden de
creacin de los hilos ser respetado, es decir se ejecutarn partiendo del
primero hasta el quinto:
Para agregar el join, por cada ejecucin de
siguiente lnea de cdigo:

un hilo debers agregar la

Listo, como puedes ver tambin marca un error, por lo cual lo encerraremos
con un try catch para evitar cualquier excepcin no esperada.

Repetimos el procedimiento para cada hilo creado, es decir el join() y luego


un try catch:
Hilo 2

Hilo 3

Hilo 4

Hilo 5

Listo! Ahora corremos el programa y veremos que la salida ahora est


ordenada, podemos correrlo las veces que sean y el resultado ser el
mismo, lo cual demuestra que ahora hay un sincronizador de procesos
ejecutndose por cada
tarea:
Corrida
1
Corrida 2

También podría gustarte