Sie sind auf Seite 1von 4

Hilos en el ambiente de programacin de Java

El ambiente de desarrollo de Java soporta programacin con mltiples hilos por medio de bibliotecas, el lenguaje mismo y con la ayuda del sistema de tiempo de ejecucin. A continuacin se listan las caractersticas ms importantes con las que cuenta Java para soportar el uso de hilos. El mtodo run. Antes que nada, necesitamos proveer a cada hilo con un mtodo run para indicarle qu debe hacer. El cdigo de este mtodo implementa el comportamiento en ejecucin del hilo y puede hacer, prcticamente cualquier cosa capaz de ser codificada en Java. Existen dos tcnicas para proveer un mtodo run para un hilo:

Haciendo una subclase de Thread y sobrecargando run Implementando la interface Runnable. Aqu cabe mencionar, que el autor del libro de texto (Jim Farley) incurre en un error al mencionar que Java provee dos clases para soportar hilos (pgina 84, segundo prrafo); ya que Thread es una clase, pero Runnable es una interface.

Tenemos buenas razones para utilizar cada una de estas tcnicas. Sin embargo, a manera de regla emprica: ``Si las clases que elaboras deben ser subclases de otras clases (un caso comn es Applet), entonces debe usarse Runnable.'' El ciclo de vida de un hilo. Una vez que el hilo hace algo, podemos manejar el ciclo de vida de un hilo: como crear y arrancar un hilo, algunas cosas especiales que podemos hacer mientras se ejecuta y como detenerlo. En el siguiente diagrama podemos ver los estados en los que un hilo puede estar durante su vida.

Ciclo de vida de un hilo de Java

Prioridades. La gran ventaja que ofrecen los hilos (como se puede inferir de lo anteriormente expuesto) es que corren de manera concurrente. Conceptualmente, esto es cierto, pero en la prctica generalmente no es posible. La mayora de las computadoras tienen un slo procesador, por lo tanto los hilos corren uno a la vez de forma tal que proveen la ilusin de concurrencia (esto es llamado scheduling). El sistema de ejecucin de Java soporta un algoritmo determinstico (para el scheduler) llamado fixed priority scheduling. Este algoritmo asigna tiempo de ejecucin a un hilo basado en su prioridad relativa a los dems hilos que estn listos para ejecutarse. Cuando se crea un nuevo hilo, hereda su prioridad del hilo que lo crea, sta puede ser modificada con el mtodo setPriority. Las prioridades son enteros entre MIN_PRIORITY y MAX_PRIORITY (constantes definidas en la clase Thread). Entre ms alto el entero, ms alta la prioridad. Si dos hilos con la misma prioridad estn esperando que el CPU los ejecute, el scheduler escoge uno utilizando round-robin (i.e. escoge uno aleatoriamente, se supone que round-robin ofrece iguales probabilidades de ejecucin a los hilos en cuestin). El hilo escogido para ejecucin, corre hasta que alguna de estas condiciones sea verdadera:

Un hilo con mayor prioridad est listo para ejecucin. El hilo cede su lugar (yields), o su mtodo run termina. En sistemas que soportan rebanadas de tiempo (time slicing), su tiempo asignado ha expirado.

En ese momento el segundo hilo es atendido por el CPU y as sucesivamente hasta que el intrprete termina. El algoritmo del scheduler es preemptive. Si en cualquier momento un thred con mauyor prioridad que los dems est listo para ser ejecutado, el sistema de ejecucin de Java lo escoge para ser ejecutado. Entonces decimos que el nuevo hilo (de mayor prioridad) desaloja (domina, toma la primera posicin, etc.) a los dems. La prioridad de los hilos debe ser utilizada slo para modificar la poltica de asignacin del scheduler (por cuestiones de eficiencia) y no para manejar la correctez de un programa. Esto debido a que el scheduler puede decidir ejecutar a un hilo con menor prioridad para evitar inanicin.

Sincronizacin. Cuando tenemos varios hilos, muchas veces deseamos que stos pueden compartir datos, por lo tanto, es indispensable saber sincronizar sus actividades; sto tambin nos permitir evitar inanicin y abrazos mortales. En muchas situaciones, hilos que se ejecutan concurrentemente comparten informacin y deben considerar el estado de las actividades de los dems hilos. Un modelo muy comn de tales conjuntos de hilos es conocido como escenarios de productor/consumidor, donde el productor genera un flujo de datos que es consumido por un consumidor. Los segmentos de cdigo dentro de un programa que accesan el mismo objeto desde hilos separados (concurrentes) se llaman regiones crticas. En Java, una seccin crtica puede ser un bloque o un mtodo (el autor del libro de texto (pp. 92, prrafo 5), menciona que el mtodo o bloque de cdigo es sincronizado sobre una clase, un objeto o arreglo, lo cual es cierto; sin embargo durante la primera exposicin hubo gran discusin en la clase, porque no quedaba claro como sincronizar un objeto por ejemplo. La respuesta es clara ahora: no hay tal cosa como sincronizar un objeto!, slo bloques de cdigo o mtodos pueden ser sincronizados y -como efecto lateral- una clase, un objeto o un arreglo adquieren un candado -lock. ste candado lo asigna Java a todo objeto que tenga cdigo sincronizado y es utilizado para sincronizar a todos los hilos que utilicen ese ``cdigo'' y evitar as situaciones de concurso. La discusin en clase fue provocada por un mal entendido.) Java provee algunos mtodos ms para coordinar las actividades de los hilos, como notifyAll, wait, etc., pero algunos slo son mencionados en el texto (Debido a los ejemplos de juguete -no distribudos, por cierto?) y su funcin es evidente, por lo cual tmpoco entraremos en detalle aqu. Agrupamientos de hilos. Este tema slo recibe dos prrafos en el captulo. De hecho, el autor da a entender que podemos si queremos- agrupar hilos para formar una jerarqua, quedando implcito el hecho ``si queremos''. La realidad no es as, todo hilo en Java es miembro de un grupo. Un grupo de hilos nos da las herramientas para meter varios hilos en un slo objeto y manipularlos (a todos) al mismo tiempo (a esto le llama: ``comodidad''). La clase ThreadGroup implementa los grupos de hilos en Java. El sistema de ejecucin de Java pone a un hilo en un grupo durante la construccin del hilo. Cuando se crea un hilo, uno puede escoger el grupo al que pertenecer o permitir que el sistema seleccione un grupo razonable por omisin para nuestro nuevo hilo. El hilo as creado es miembro permanente del grupo al cual se una durante su creacin -no puede ser cambiado. Si se crea un hilo sin especificar su grupo en el constructor, el sistema de ejecucin automticamente pone el nuevo hilo en el mismo grupo que el hilo que lo crea. Cuando una aplicacin de Java arranca, el sistema de ejecucin de Java crea un ThreadGroup llamado main. A menos que se especifique lo contrario, todos los nuevos hilos que se creen durante el desarrollo de la aplicacin sern miembros del grupo de hilos main.

La clase Thread provee tres constructores que te permiten asignar a un grupo al hilo que ests creando. Finalmente la clase ThreadGroup provee un conjunto de mtodos que te permiten obtener informacin como: qu otros hilos pertenecen al mismo grupo, modificar los hilos por grupo: suspenderlos, activarlos, detenerlos, etc. todo con una sla invocacin a los mtodos respectivos. A manera de ejemplo consdere: ThreadGroup migrupo = new ThreadGroup(``Mi grupo de hilos''); Thread myhilo = new Thread(migrupo, ``Un hilo en mi grupo''); ... elgrupo = myhilo.getThreadGroup(); ...

Das könnte Ihnen auch gefallen