Sunteți pe pagina 1din 7

Repblica Bolivariana de Venezuela Ministerio del Poder Popular para la Educacin Universitaria Instituto Universitario Politcnico Santiago Mario

Extensin COL Sede Ciudad Ojeda

Realizado por Vernica Arias 20.856.909

Ciudad Ojeda, Junio 2013

CICLO DE VIDA DE UN HILO Un hilo, cuando se crea, pasa al estado de creado. Cuando llamamos al mtodo start() del hilo, este pasa al estado "listo". Cuando el sistema encuentra el hilo que posee mayor prioridad hace que ste pase al estado "ejecutando" asignndole el procesador. Una vez que se est ejecutando al hilo le pueden suceder 6 cosas:

La primera es que el hilo solicite una operacin de entrada/salida(E/S). Si es as, como esta operacin es muy lenta en comparacin con la velocidad del microprocesador, este hilo pasar al estado de "bloqueado", de donde saldr cuando sea finalizada esa operacin E/S pasando al estado "listo". Puede que el hilo ejecute el mtodo sleep. Con la ejecucin de este mtodo el hilo pasa al estado "dormido" de donde saldr cuando finalice el tiempo que se ha especificado que debe permanecer en este estado (el mtodo sleep lleva como parmetro el nmero de milisegundos que el hilo ha de estar dormido).Una vez finalizado dicho tiempo pasar al estado de "listo". Si se ejecuta el mtodo suspend(). Este mtodo har que el hilo entre en el estado de "suspendido", y a diferencia del estado de dormido", no saldr de ah en un tiempo estipulado, sino que slo lo har cuando se llame al mtodo resume() del hilo, que har que ste vuelva al estado de "listo". Si se invoca al mtodo wait(). Este mtodo har que el hilo pase al estado "en espera".Este estado se da cuando se requiere el uso de un objeto por parte del hilo de ejecucin y ste organiza una cola para que slo pueda ser utilizado por el nmero de hilos que la lgica de programacin de este objeto permita. Se usa mucho para crear zonas de 'semforos' en las que slo un nmero de hilos concretos pueda entrar simultneamente (programacin concurrente).El hilo dejar la cola cuando se llame al mtodo notify y pasar al estado de listo. Si se llama al mtodo notifyAll() el objeto pasara al estado de listo todos los hilos que tiene en la cola del estado de "en espera". Llamamos al mtodo stop(). Si hacemos esto el hilo pasar al estado de terminado con lo que habr finalizado su ciclo de vida. Es la muerte de un hilo. A este estado tambin se puede pasar cuando el hilo ejecute todas las sentencias que tiene programadas, con lo que habr finalizado su labor o tarea encomendada y por lo tanto habr llegado el momento de terminar su ciclo de vida. La ltima es que el hilo ejecute un conjunto de sentencias y que no se produzca ningn caso de los anteriores.En este caso, si hay hilos en el estado de listo, la mquina virtual har que el hilo deje el procesador para que lo usen otros hilos que estn preparados para ello y pondr a este hilo en el estado de listo.

Con estas descripciones hemos detallado todos los estados que puede recorrer un Hilo o Thread en su ciclo de vida. Hay que destacar como funciona la organizacin de las colas que se producen en los diferentes estados al encontrarse en ellos varios hilos a la vez. En primer lugar los hilos llevan un parmetro que es modificable mediante programacin de prioridad. El que mayor prioridad tiene antes pasa. A igual prioridad, el primero que lleg a la cola es el primero que pasa al estado de ejecutando. Si un hilo no se ejecuta a medida que va pasando tiempo en listo la mquina virtual le va aumentando su prioridad

para que gane puestos en la lista y no se produzca una situacin de hambruna (un hilo tiene menos prioridad que otros y nunca llega a entrar en el procesador porque siempre habr otro hilo de prioridad mayor esperando con l en el estado "listo"). Las colas tienen la misma organizacin, es decir, primero llega, antes sale, en el resto de estados. Por ultimo detallamos cual son los mtodos de la clase Thread que tienen relacin directa sobre su ciclo de vida. Mtodo Descripcin Empieza la ejecucin del Thread.Se invoca start() al mtodo run() de dicho hilo. Finaliza la ejecucin del hilo. stop() sleep(long milisegundos) Pone el hilo en estado de "dormido" un nmero de milisegundos Pone el hilo en estado de "dormido" un sleep(long nmero de milisegundos y nanosegundos milisegundos,int nanosegundos) Pone el Thread en estado de suspendido. suspend() Reanuda la ejecucin de un Thread que resume() estaba previamente en estado suspendido. Cede el control del microprocesador a otro yield() hilo, ponindose en la cola del estado "listo" voluntariamente.

MANEJO DE PRIORIDADES Prioridad de Hilos El planificador de hilos hace uso de las prioridades de los mismos para decidir cundo debe dejar a cada hilo que se ejecute, de manera que los hilos con mayor prioridad deben ejecutarse ms a menudo que lo de menor prioridad. Cuando est ejecutndose un hilo de baja prioridad, y otro de mayor prioridad se despierta de su sueo, o de la espera por una operacin de E/S, debe dejarse que se ejecute de manera inmediata, desalojando al hilo de menor prioridad. Cuando los hilos son de igual prioridad deben desalojarse los unos a los otros, cada cierto tiempo, utilizando el algoritmo circular round-robin para gestionar el acceso al la CPU. En JDK 1.0 la planificacin de hilos es un problema que no est completamente resuelto. Por lo que si pretendemos tener un comportamiento predecible sobre las aplicaciones deberemos utilizar hilos que, voluntariamente, cedan el control de la CPU.

SINCRONIZACION DE HILOS Cuando en un programa tenemos varios hilos corriendo simultneamente es posible que varios hilos intenten acceder a la vez a un mismo sitio (un fichero, una conexin, un array de datos) y es posible que la operacin de uno de ellos entorpezca la del otro. Para evitar estos problemas, hay que sincronizar los hilos. Por ejemplo, si un hilo con vocacin de Cervantes escribe en fichero "El Quijote" y el otro con vocacin de Shakespeare escribe "Hamlet", al final quedarn todas las letras entremezcladas. Hay que conseguir que uno escriba primero su Quijote y el otro, luego, su Hamlet. Sincronizar usando un objeto Imagina que escribimos en un fichero usando una variable fichero de tipo PrintWriter. Para escribir uno de los hilos har esto fichero.println("En un lugar de la Mancha..."); Mientras que el otro har esto fichero.println("... ser o no ser ..."); Si los dos hilos lo hacen a la vez, sin ningn tipo de sincronizacin, el fichero al final puede tener esto En un ... ser lugar de la o no Mancha ser ... Para evitarlo debemos sincronizar los hilos. Cuando un hilo escribe en el fichero, debe marcar de alguna manera que el fichero est ocupado. El otro hilo, al intentar escribir, lo ver ocupado y deber esperar a que est libre. En java esto se hace fcilmente. El cdigo sera as synchronized (fichero) { fichero.println("En un lugar de la Mancha..."); } y el otro hilo synchronized (fichero) {

fichero.println("... ser o no ser ..."); } Al poner synchronized(fichero) marcamos fichero como ocupado desde que se abren las llaves de despus hasta que se cierran. Cuando el segundo hilo intenta tambin su synchronized(fichero), se queda ah bloqueado, en espera que de que el primero termine con fichero. Es decir, nuestro hilo Shakespeare se queda parado esperando en el synchronized(fichero) hasta que nuestro hilo Cervantes termine. synchronized comprueba si fichero est o no ocupado. Si est ocupado, se queda esperando hasta que est libre. Si est libre o una vez que est libre, lo marca como ocupado y sigue el cdigo. Este mecanismo requiere colaboracin entre los hilos. El que hace el cdigo debe acordarse de poner synchronized siempre que vaya a usar fichero. Si no lo hace, el mecanismo no sirve de nada. Mtodos sincronizados Otro mecanismo que ofrece java para sincronizar hilos es usar mtodos sincronizados. Este mecanismo evita adems que el que hace el cdigo tenga que acordarse de poner synchronized. Imagina que encapsulamos fichero dentro de una clase y que ponemos un mtodo synchronized para escribir, tal que as public class ControladorDelFichero { private PrintWriter fichero; public ControladorFichero() { // Aqui abrimos el fichero y lo dejamos listo // para escribir. } public synchronized void println(String cadena) { fichero.println(cadena); } } Una vez hecho esto, nuestros hilos Cervantes y Shakespeare slo tienen que hacer esto ControladorFichero control = new ControladorFichero(); ... // Hilo Cervantes control.println("En un lugar de la Mancha ..."); ... // Hilo Shakespeare control.println("... ser o no ser ...");

Al ser el mtodo println() synchronized, si algn hilo est dentro de l ejecutando el cdigo, cualquier otro hilo que llame a ese mtodo se quedar bloqueado en espera de que el primero termine. Este mecanismo es ms mejor porque, siguiendo la filosfa de la orientacin a objetos, encapsula ms las cosas. El fichero requiere sincronizacin, pero ese conocimiento slo lo tiene la clase ControladorFichero. Los hilos Cervantes y Shakespeare no saben nada del tema y simplemente se ocupan de escribir cuando les viene bien. Tampoco depende de la buena memoria del programador a la hora de poner el synchronized(fichero) de antes. Otros objetos que necesitan sincronizacin Hemos puesto de ejemplo un fichero, pero requieren sincronizacin en general cualquier entrada y salida de datos, como pueden ser ficheros, sockets o incluso conexiones con bases de datos. Tambin pueden necesitar sincronizacin almacenes de datos en memoria, como LinkedList, ArrayList, etc. Imagina, por ejemplo, en una LinkedList que un hilo est intentando sacar por pantalla todos los datos LinkedList lista = new LinkedList(); ... for (int i=0;i<lista.size(); i++) System.out.println(lista.get(i)); Estupendo y maravilloso pero ... qu pasa si mientras se escriben estos datos otro hilo borra uno de los elementos?. Imagina que lista.size() nos ha devuelto 3 y justo antes de intentar escribir el elemento 2 (el ltimo) viene otro hilo y borra cualquiera de los elementos de la lista. Cuando intentemos el lista.get(2) nos saltar una excepcin porque la lista ya no tiene tantos elementos. La solucin es sincronizar la lista mientras la estamos usando LinkedList lista = new LinkedList(); ... synchronized (lista) { for (int i=0;i<lista.size(); i++) System.out.println(lista.get(i)); } adems, este tipo de sincronizacin es la que se requiere para mantener "ocupado" el objeto lista mientras hacemos varias llamadas a sus mtodos (size() y get()), no queda ms remedio que hacerla as. Por supuesto, el que borra tambin debe preocuparse del synchronized. OBJETOS RUNNABLE Si queremos tener ms de un hilo necesitamos crear otra instancia de Thread. Cuando construimos una nueva instancia de Thread, necesitamos decirle que cdigo ejecutar en el nuevo hilo de control. Se puede comenzar un hilo sobre cualquier objeto que implemente la interfaz Runnable.

Runnable es una interfaz simple que abstrae la nocin de que se desea que algn cdigo se "ejecute" asncronamente. Para implementar Runnable, a una clase le basta con implementar un solo mtodo llamado run. Este es un ejemplo que crea un nuevo hilo. Cdigo con la implementacin de un Objeto Runnable

S-ar putea să vă placă și