threads java ucv

Download Threads  java ucv

If you can't read please download the document

Upload: joaneddyhuancacruz

Post on 07-Jun-2015

1.941 views

Category:

Documents


5 download

DESCRIPTION

conceptos basicos sobre los threads en java

TRANSCRIPT

AO DE LAS CUMBRES MUNDIALES EN EL PERU" ESCUELA DE INGENIERIA DE SISTEMAS UCV PIURA

INTEGRANTES : DOCENTE : Huanca Cruz Joan Eddy Mendoza Yovera Lucia Carolina Balcazar Rivas Renato Hernndez Abramonte Wilfredo

Ing. CIP Aldo Pereda Castillo : Programacin Orientada a Objetos

CURSO

CICLO ESCUELA

: :

IV

Ing. Sistemas

20081

INTRODUCCION El tema que trataremos en el presente trabajo, es uno de los ms interesantes que puede tener un lenguaje de programacin (java), muchos al iniciarnos en este muy bonito e interesante mundo de la programacin, solo realizbamos programas (c, c++, etc.), el cual trataba de darle una orden y este cumpliese con un cometido, no dndonos la oportunidad de realizar otra cosa si es que por ejemplo: esperaba que ingrese algn dato. Este problema es superado con java, que nos brinda la oportunidad de realizar distintas acciones, en tiempo compartido, es decir dar la sensacin de realizar infinidad de cosas al mismo tiempo, pero que en realidad internamente es un simple repartimiento de memoria. Todos tenemos siempre aunque en forma indirecta el contacto con este mecanismo: cuando hacemos el uso del programa Microsoft Word vemos que este programa realiza tareas de forma Simultanea, por ejemplo, podemos estar escribiendo y a la vez el programa est revisando los errores ortogrficos para corregirlos. O tambin el mismo sistema operativo por que puede estar copiando archivos, a la vez mostrando la hora, navegando por internet, etc. Sin ms prembulos empecemos con todo lo que concierne a los Threads, un tema que a mi parecer es la matriz de la programacin orientada a objetos.

2

INDICEI.QUE ES UNTHREAD 3 PARA QUE SE UTILIZAN ? 1. TIPOS DE THREAD 2. CONTROL BASICO DE UN THREAD CLASES RELACIONADAS CON LOS HILOS5 1. LA CLASE THREADS 2. Runnable 3. ThreadDeath 4. TreadGroup 5. Object CICLO DE VIDA DE UN THREAD 8 PRIORIDADES .8

II.

III. IV. V.

CONTROL DE UN HILO..12 1. Arranque de un hilo 2. Manipulacin de un hilo 3. Suspensin de un Hilo 4. Parada de un Hilo stop () isAlive () VI. AGRUPAMIENTO DE HILOS...13 1. Grupo de hilos por defecto 2. Grupo de hilos de forma explicita VII. LA CLASE ThreadGroup 15

VIII.

THREAD DAEMON.15

IX . SINCRONIZACION..16 1. Uso de synchronized. 2. Comunicacin entre threads 3. Monitores IX. CONCLUSIONES.18

3

I. QUE ES UN THREAD:Tambin conocido en java como hilos o subproceso. Los threads o hilos de ejecucin son segmentos de cdigo de un programa que se ejecutan secuencialmente de modo independiente de otras partes del programa.Un proceso puede estar constituido por uno o mas threads. Un thread es un contexto de ejecucin, proceso ligero o tarea donde hay un flujo secuencial de control y que utiliza los recursos disponibles para un programa. La Mquina Virtual Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar varios hilos de ejecucin simultneamente. La JVM gestiona todos los detalles, asignacin de tiempos de ejecucin, prioridades, etc. De forma similar a como gestiona un Sistema Operativo mltiples procesos. La diferencia bsica entre un proceso de Sistema Operativo y un Thread Java es que los hilos corren dentro de la JVM, que es un proceso del Sistema Operativo y por tanto comparten todos los recursos, incluida la memoria y las variables y objetos all definidos. A este tipo de procesos donde se comparte los recursos se les llama a veces procesos ligeros. Desde el punto de vista de las aplicaciones los hilos son tiles porque permiten que el flujo del programa sea divido en dos o ms partes, cada una ocupndose de alguna tarea de forma independiente. Por ejemplo un hilo puede encargarse de la comunicacin con el usuario, mientras que otros actan en segundo plano, realizando la transmisin de un fichero, Accediendo a recursos del sistema (cargar sonidos, leer ficheros...), etc. De hecho, todos los programas con interfaz grfico (AWT o Swing) son multihilo porque los eventos y las rutinas de dibujado de las ventanas corren en un hilo distinto al principal. PARA QUE SE UTILIZAN ? Los threads se utilizan para aislar y coordinar tareas. Sin el uso de threads hay aplicaciones que son casi imposibles de programar: Las que tienen tiempos de espera importantes entre etapas Las que consumen muchos recursos de CPU e impiden que el procesador atienda simultneamente otros eventos o peticiones del usuario

4

1. TIPOS DE THREAD Tipos de threads que pueden aparecer en una aplicacin:

Threads completamente independientes, que realizan tareas no relacionadas. ste es el caso ms sencillo y no requiere ninguna programacin especial. Threads que trabajan en una misma tarea, pero sin interferir ni intercambiar relacin entre ellos. Por ejemplo, threads que colaboran en el producto de dos matrices ocupndose cada una de ellas de calcular ciertas filas de la matriz producto. Threads que utilizan recursos de modo mutuamente exclusivo, aunque sin tener que coordinar sus actividades. Por ejemplo, threads que actualizan o leen registros de una base de datos y que no pueden actuar simultneamente. Threads que deben de coordinar sus actividades, de modo que una de ellas no puede empezar o continuar hasta que la otra haya realizado su tarea. Los ejemplos ms tpicos son los de tipo productorconsumidor, en el que este ltimo tiene que esperar para realizar su funcin a que el productor le haya preparado los datos y le avise de esa circunstancia.

2. CONTROL BASICO DE UN THREAD Finalizacin del la ejecucin de un thread.

o Cuando un thread acaba su ejecucin y es finalizado, no puede volver a ser ejecutado. o Podemos detener un thread utilizando un flag que utiliza un mtodo run que debe terminar la ejecucin. r.stopRunning() // r instancia de una clase que implementa runnable Verificacin del estado thread isAlived() o boolean isAlived (). Devuelve true si el thread ha sido inicializado con start y no ha terminado el ciclo de ejecucin. Bloqueo de threads. o sleep(). Permite detener un thread durante un determinado tiempo

5

o join(). Bloquea el thread actual, hasta que el thead sobre el cual ha sido ejecutado el join termina.

II. CLASES RELACIONADAS CON LOS HILOS:El lenguaje de programacin Java proporciona soporte para hilos a travs de una simple interfase. Y un conjunto de clases. La interfase de Java y las clases que incluyen funcionalidades sobre Hilos son las siguientes: Thread Runnable ThreadDeath ThreadGroup Object

Todas estas clases son parte del paquete Java.lang.

1. la clase threadLa clase Thread es la clase responsable de producir hilos funcionales para otras clases. La forma ms directa para aadir la funcionalidad a un hilo es extender la clase Thread, y redefinir el mtodo run (). Este mtodo es invocado cuando se inicia el hilo (mediante una llamada a mtodo start () de la clase Thread). El hilo se inicia con la llamada al mtodo run () y termina cuando termina ste. Pero esta forma nos provoca algunas limitaciones, como bien sabemos JAVA no admite la herencia mltiple, As que si queremos heredar de otra clase ya no lo podemos hacer por que ya estamos heredando de la clase thread; pero felizmente existe una solucin a este inconveniente, esto se realiza implementando lo que llamamos como interfaz, debemos implementar la interfaz runnable que veremos ms a delante. El ejemplo ilustra estas ideas:

public class ThreadEjemplo extends Thread { public ThreadEjemplo (String str) { super (str); }

6

public void run() { for (int i = 0; i < 10 ; i++) System.out.println (i + " " + getName ()); System.out.println ("Termina thread + getName ()); } Public static void main (String [] args) { new ThreadEjemplo ("Pepe").start(); new ThreadEjemplo("Juan").start(); System.out.println("Termina thread main"); } }

2. RunnableJava no soporta herencia mltiple de forma directa, es decir, no se puede derivar una clase de varias clases padre. Esto nos plantea la duda sobre cmo podemos aadir la funcionalidad de Hilo a una clase que deriva de otra clase, siendo sta distinta de Thread. Para lograr esto se utiliza la interfaz Runnable. La interfaz Runnable proporciona la capacidad de aadir la funcionalidad de un hilo a una clase simplemente implementando la interfaz, en lugar de derivndola de la clase Thread. Las clases que implementan la interfaz Runnable proporcionan un mtodo run que es ejecutado por un objeto hilo asociado que es creado aparte. Esta es una herramienta muy til y a menudo es la nica salida que tenemos para incorporar multihilo dentro de las clases. Esta cuestin ser tratada ms ampliamente en el apartado de Creacin de hilos. Aunque es un nico mtodo el que se define en esta interfaz

3. ThreadDeathLa clase de error ThreadDeath proporciona un mecanismo que permite hacer limpieza despus de que un hilo haya sido finalizado de forma asncrona. Se llama a ThreadDeath una clase error porque deriva de la clase Error, la cual proporciona medios para manejar y notificar errores. Cuando el mtodo stop de un hilo es invocado, una instancia de ThreadDeath es lanzada por el moribundo hilo como un error. Slo se debe recoger el objeto ThreadDeath si se necesita para realiza una limpieza especfica a la terminacin asncrona, lo cual es una

7

situacin bastante inusual. Si se recoge el objeto, debe ser relanzado para que el hilo realmente muera.

4. ThreadGroupLa clase ThreadGroup se utiliza para manejar un grupo de hilos de modo conjunto. Esto nos proporciona un medio para controlar de modo eficiente la ejecucin de una serie de hilos. Por ejemplo la clase ThreadGroup nos proporciona mtodos stop, suspend y resume para controlar la ejecucin de todos los hilos pertenecientes al grupo. Los grupos de hilos tambin Pueden contener otros grupos de hilos permitiendo una jerarqua anidada de hilos. Los hilos individuales tienen acceso al grupo pero no al padre del grupo.

5. ObjectAunque, estrictamente hablando, no es una clase de apoyo a los hilos, la clase objeto proporciona unos cuantos mtodos cruciales dentro de la arquitectura multihilo de Java. Estos mtodos son wait, notify y notifyAll. El mtodo wait hace que el hilo de ejecucin espere en estado dormido hasta que se le notifique que contine. Del mismo modo, el mtodo notify informa a un hilo en espera de que contine con su ejecucin. El mtodo notifyAll es similar a notify excepto que se aplica a todos los hilos en espera. Estos tres mtodos solo pueden ser llamados desde un mtodo o bloque sincronizado (o bloque de sincronizacin). Normalmente estos mtodos se utilizan cuando hay ejecucin multihilo, es decir, cuando un mtodo espera a que otro mtodo termine de hacer algo antes de poder continuar. El primer hilo espera hasta que otro hilo le notifique que puede continuar. La clase objeto est en la parte superior de la jerarqua de Java, lo cual significa que es el padre de todas las clases. En otras palabras, cada clase Java hereda la funcionalidad proporcionada por la clase objeto, incluyendo los mtodos wait, notify y notifyAll.

8

III. CICLO DE VIDA DE UN THREAD:

El inicio de este ciclo empieza con la instancia de la clase thread, es decir se crea un nuevo thread que est en su estado inicial; en este estado es solo un objeto ms. No existe el thread en ejecucin. El nico mtodo que puede invocarse sobre l es el mtodo Start(). Al invocarse ste sobre el hilo el sistema crea los recursos necesarios, lo planifica (le asigna prioridad) y luego llama al mtodo run(). En este momento el hilo est corriendo se encuentra en estado runnable (ejecutable). Si el mtodo run() invoca internamente el mtodo sleep() o wait() o el hilo tiene que esperar por una operacin de entrada/salida, entonces el hilo pasa al estado no runnable (no ejecutable) hasta que la condicin de espera finalice. Durante este tiempo el sistema puede ceder control a otros hilos activos. Por ltimo cuando el mtodo run finaliza el hilo termina y pasa a la situacin Dead (Muerto).

IV.PRIORIDADES:Los programas en java pueden utilizar el subprocesamiento mltiple. Todo subproceso o hilo en java tiene una prioridad en el rango entre Thread. MIN_PRIORITY (una constante de 1) y Thread.MAX_PRIORITY (una constante de 10). De manera informal, los hilos con mayor prioridad son mas importantes para un programa, y se les debe asignar tiempo en el procesador antes que a los hilos de menor prioridad. Sin embargo las prioridades de los

9

hilos no pueden garantizar el orden en que se ejecutarn. De manera predeterminada, a cada hilo se le asigna la prioridad Thread.NORM_PRIORITY (una constante de 5). Cuando hay varios hilos en condiciones de ser ejecutados (estado runnable), la mquina virtual elige el hilo que tiene una prioridad ms alta, que se ejecutar hasta que:

Un hilo con una prioridad ms alta est en condiciones de ser ejecutado (runnable) El hilo termina (termina su mtodo run) Se detiene voluntariamente Alguna condicin hace que el hilo no sea ejecutable (runnable), como una operacin de entrada/salida o, si el sistema operativo tiene planificacin por divisin de tiempos (time slicing), cuando expira el tiempo asignado.

Si dos o ms hilos estn listos para ejecutarse y tienen la misma prioridad, la mquina virtual va cediendo control de forma cclica (round-robin). El hecho de que un hilo con una prioridad ms alta interrumpa a otro se denomina se denomina planificacin apropiativa (preemptive scheduling). Cuando un hilo entra en ejecucin y no cede voluntariamente el control para que puedan ejecutarse otros hilos, se dice que es un hilo egosta (selfish thread). Algunos Sistemas Operativos, como Windows, combaten estas actitudes con una estrategia de planificacin por divisin de tiempos (time-slicing), que opera con hilos de igual prioridad que compiten por la Sistemas Distribuidos. En estas condiciones el Sistema Operativo asigna tiempos a cada hilo y va cediendo el control consecutivamente a todos los que compiten por el control de la CPU, impidiendo que uno de ellos se apropie del sistema durante un intervalo de tiempo prolongado. Recordar que este mecanismo lo da el sistema operativo, no JAVA.

Mtodos para el manejo de prioridades:

10

SetPriority; Ajusta la prioridad de un hilo o thread, el cual acepta un argumento int en el rango de 1-10. GetPriority; Devuelve la prioridad del subproceso o hilo.

Yield; da a otros subprocesos o hilos la oportunidad para ejecutarse.

OTRA FORMA DE CREAR HILOSImplementndolo con la interfase Runnable. Veamos el siguiente ejemplo: public class MiThread implements Runnable { Thread t; public void run() { // Ejecucin del thread una vez creado } } En este caso necesitamos crear una instancia de Thread antes de que el sistema pueda ejecutar el proceso como un hilo. Adems, el mtodo abstracto run que est definido en la interfaz Runnable tiene que implementarse en la nueva clase creada. La diferencia entre ambos mtodos de creacin de hilos en Java radica en la flexibilidad con que cuenta el programador, que es mayor en el caso de la utilizacin de la interfaz Runnable. Sobre la base del ejemplo anterior, se podra extender la clase MiThread a continuacin, si fuese necesario. La mayora de las clases creadas que necesiten ejecutarse como un hilo implementarn la interfaz Runnable, ya que as queda cubierta la posibilidad de que sean extendidas por otras clases. Por otro lado, es un error pensar que la interfaz Runnable est realizando alguna tarea mientras un hilo de alguna clase que la implemente se est ejecutando. Es una interfaz, y como tal, slo contiene funciones abstractas (concretamente una nica, run), proporcionando tan solo una idea de diseo, de infraestructura, de la clase Thread, pero ninguna funcionalidad. Su declaracin en Java tiene el siguiente aspecto:

package Java.lang;

11

public interfaz Runnable { public abstract void run() ; } Comentados los aspectos ms importantes de la interfaz Runnable, veamos ahora la definicin de la clase Thread, de la cual podemos deducir lo que realmente se est haciendo: public class Thread implements Runnable { ... public void run() { if( tarea != null ) tarea.run () ; } ...} Se deduce, por tanto, que la propia clase Thread de Java tambin implementa la interfaz Runnable. Observamos que en el mtodo run de Thread se comprueba si la clase con que se est trabajando en ese momento (tarea), que es la clase que se pretende ejecutar como hilo, es o no nula. En caso de no ser nula, se invoca al mtodo run propio de dicha clase. Una vez de haber visto las dos maneras de crear un hilo , sale a la luz la interrogante de cual es mejor usar , a continuacin veamos un poco de los beneficios de cada uno :

o Implementar la interfaz Runnable: Mejor diseo orientado a objetos. La clase thread solo deber ser extendida cuando se pretenda modificar o extender el comportamiento de dicho modelo de ejecucin. Herencia simple. Debido a la tecnologa de Java no es posible extender una clase cuando sta ya ha sido extendida a la clase thread

o Extender la clase Thread: Cdigo ms simple. En el mtodo run la referencia this apunta a la instancia del thread actual

V. CONTROL DE UN HILO:12

1. Arranque de un hiloEn el contexto de las aplicaciones, sabemos que es main la primera funcin que se invoca tras arrancar, y por tanto, lgicamente, es el lugar ms apropiado para crear y arrancar otros hilos. La lnea de cdigo: TestTh t1 = new TestTh (Thread 1",(int) (Math.random ()*2000)); siendo TestTh una subclase de la clase Thread (o una clase que implemente la interfaz Runnable) crea un nuevo hilo. Los dos argumentos pasados, sin mayor relevancia, satisfarn el prototipo del constructor de la clase y se utilizarn para la inicializacin del objeto. Al tener control directo sobre los hilos, tenemos que arrancarlos explcitamente. Como ya se coment anteriormente, es la funcin miembro start la que nos permite hacerlo. En nuestro ejemplo sera: start (); en realidad es un mtodo oculto en el hilo que llama al mtodo run.

2. Manipulacin de un hiloSi todo fue bien en la creacin del objeto TestTh (t1), ste debera contener un hilo, una traza de ejecucin vlida, que controlaremos en el mtodo run del objeto. El cuerpo de esta funcin miembro viene a ser el cuerpo de un programa como ya los conocemos. Digamos que es la rutina main a nivel de hilo. Todo lo que queremos que haga el hilo debe estar dentro del mtodo run. Cuando finalice run, finalizar tambin el hilo que lo ejecutaba. 3. Suspensin de un Hilo La funcin miembro suspend de la clase Thread permite tener un control sobre el hilo de modo que podamos desactivarlo, detener su actividad durante un intervalo de tiempo indeterminado, a diferencia del uso de la llamada al sistema sleep, que simplemente lleva al hilo a un estado de dormido, y siempre durante un nmero de milisegundos concreto. Este mtodo puede resultar til si, construyendo un applet con un hilo de animacin, queremos permitir al usuario detener (que no finalizar) la animacin, hasta que ste decida reanudarla.

13

El hilo es suspendido indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin a la funcin miembro resume.

4. Parada de un HiloYa conocemos los mtodos de control de hilos que nos permiten arrancarlos, suspenderlos y reanudarlos. El ltimo elemento de control que se necesita sobre hilos es el mtodo stop, utilizado para terminar la ejecucin de un hilo de forma permanente:

stop ();

Sealar que esta llamada no destruye el hilo, sino que detiene su ejecucin, y sta no puede reanudarse con el mtodo start. Cuando se designen las variables que se usan en el hilo, el objeto hilo (creado con new) quedar marcado para eliminarlo y el garbage collector (recolector de basura de Java) se encargar de liberar la memoria que utilizaba. Tiene sentido su utilidad, por ejemplo, en aplicaciones complejas que necesiten un control sobre cada uno de los hilos que se lancen. Por ltimo, un mtodo de control de hilos que nos permite comprobar si una instancia est viva (el hilo se ha arrancado y an no se ha detenido) o no (bien no se arranc; bien ya finaliz). Estamos hablando de la funcin miembro isAlive.

isAlive ();

Devolver true en caso de que el hilo est vivo, es decir, ya se haya llamado a su mtodo run y no haya sido parado con un stop ni haya terminado el mtodo run en su ejecucin. En otro caso, lgicamente, devolver false.

VI. AGRUPAMIENTO DE HILOS:Todo hilo de Java es un miembro de un grupo de hilos. Los grupos de hilos proporcionan un mecanismo de reunin de mltiples hilos dentro de un nico objeto y de manipulacin de dichos hilos en conjunto, en lugar de una forma individual. Por ejemplo, se pueden arrancar o suspender todos los hilos que estn dentro de un grupo con una nica llamada al mtodo. Los grupos de hilos de Java estn implementados por la clase ThreadGroup en el paquete Java.lang.

14

El runtime system (sistema de tiempo de ejecucin) de Java pone un hilo dentro de un grupo de hilos en el momento de la construccin del mismo. Cuando creas un hilo, se puede dejar que el sistema de tiempo de ejecucin ponga el nuevo hilo en algn grupo razonable por defecto, o se puede establecer explcitamente el grupo del nuevo hilo. El hilo es un miembro permanente de aquel que sea el grupo de hilos al cual se uni en el momento de su creacin. No puede moverse un hilo a un nuevo grupo una vez que ha sido creado.

1.Grupo de hilos por defectoSi se crea un nuevo hilo sin especificar su grupo en el constructor, el sistema de tiempo de ejecucin colocar el nuevo hilo automticamente en el mismo grupo que el hilo que lo ha creado (conocido como grupo de hilos actual e hilo actual, respectivamente). As que, cul es el grupo de hilos del hilo principal de una aplicacin? Cuando se arranca una aplicacin Java, el sistema de tiempo de ejecucin de Java crea una instancia de la clase ThreadGroup llamada main. A menos que especifiques lo contrario, Todos los nuevos hilos que crees se convertirn en miembros del grupo de hilos main.

2.Grupo de hilos de forma explicitaComo hemos mencionado anteriormente, un hilo es un miembro permanente de aquel grupo de hilos al cual se uni en el momento de su creacin (no tenemos la posibilidad de cambiarlo posteriormente). De este modo, si quieres poner tu nuevo hilo en un grupo de hilos distinto del grupo por defecto, debes especificarlo explcitamente cuando lo creas. La clase Thread tiene tres constructores que te permiten establecer un nuevo grupo de hilos: public Thread( ThreadGroup group, Runnable runnable ) public Thread( ThreadGroup group, String name ) public Thread( ThreadGroup group, Runnable runnable, String name ) Cada uno de estos constructores crea un nuevo hilo, lo inicializa en base a los parmetros Runnable y String, y hace al nuevo hilo miembro del grupo especificado. Por ejemplo, la siguiente muestra de cdigo crea un grupo de hilos (myThreadGroup) y entonces crea un hilo (myThread) en dicho grupo ThreadGroup myThreadGroup = new ThreadGroup( My Group of Threads ); Thread myThread = new Thread( myThreadGroup, a thread for my group );

15

El ThreadGroup pasado al constructor Thread no tiene que ser necesariamente un grupo que hayas creado t, puede tratarse de un grupo creado por el sistema de ejecucin de Java, o un grupo creado por la aplicacin en la cual se est ejecutando el applet. Como ya hemos visto anteriormente un concepto sobre la clase ThreadGroup, ahora lo profundizaremos ms.

VII. LA CLASE ThreadGroup:La clase ThreadGroup es la implementacin del concepto de grupo de hilos en Java. Ofrece, por tanto, la funcionalidad necesaria para la manipulacin de grupos de hilos para las aplicaciones Java. Un objeto ThreadGroup puede contener cualquier nmero de hilos. Los hilos de un mismo grupo generalmente se relacionan de algn modo, ya sea por quin los cre, por la funcin que llevan a cabo, o por el momento en que deberan arrancarse y parar. El grupo de hilos de ms alto nivel en una aplicacin Java es el grupo de hilos denominado main. getMaxPriority y setMaxPriority getDaemon y SetDaemon getName getParent y parentOf toString resume stop suspend

IX.

THREAD DAEMON:

Los threads daemon llamados servicios, se ejecutan con prioridad baja y proporcionan un servicio bsico a un programa o programas cuando la actividad de la mquina es reducida.

a. Un ejemplo de thread demonio que est ejecutndose continuamente es el recolector de basura (garbage collector). E b. Un thread puede fijar su indicador de demonio pasando un valor true al mtodo setDaemon(). Si se pasa false a este mtodo, el thread ser devuelto por el sistema como un thread de usuario. No obstante, esto ltimo debe realizarse antes de que se arranque el thread (start ()).

16

VIII. SINCRONIZACION:o Existen muchas situaciones interesantes donde ejecutar threads concurrentes que compartan datos y deban considerar el estado y actividad de otros threads. Este conjunto de situaciones de programacin son conocidos como escenarios 'productor/consumidor'; donde el productor genera un canal de datos que es consumido por el consumidor. Como los threads comparten un recurso comn, deben sincronizarse de alguna forma.

1. Uso de synchronized.o Cada objeto tiene un flag de bloqueo La palabra clave synchronized permite controlar el flag para activar accesos exclusivos al objeto y cada objeto tendr asociada una cola de espera. Se pueden declarar bloques de cdigo synchronized. synchronized ( variableCompartida ) { } Mtodos synchronized public synchronized void nomMetode () { } o El flag de bloqueo de un objeto se libera : Cuando el thread termina el bloque de cdigo synchronized Cuando le bloque de cdigo synchronized lanza una excepcin. o Deadlock Dos threads esperando un flag de bloqueo No se detecta Se puede evitar: Decidir el orden de obtencin de los bloqueos Seguir con rigurosidad ese orden Liberar los bloqueos en orden inverso // acceso al recurso // acceso al recurso

17

2. Comunicacin entre threadso wait() y notify() Si un thread ejecuta una llamada wait() sobre un objeto x pausar su ejecucin hasta que otro thread ejecute la llamada a notify() mediante el mismo objeto x. Para poder ejecutar tanto un wait() como un notify() el thread deber disponer del flag de bloqueo, es decir, solo podrn ser ejecutadis desde un bloque de cdigo synchronized. Listas de espera o pools - Cuando un thread ejecuta wait() se libera el flag de bloqueo y es colocado en la lista de espera o pool del objeto (wait pool) -Al ejecutar notify() un thread arbitrario es movido de la lista de espera hacia una lista de threads que esperan por el flag de bloqueo (lock pool). notifyAll() despierta a todos los threads.

3. Monitoreso Cuando un mtodo synchronized se ejecuta adquiere un monitor sobre el objeto. Cuando un thread tiene el monitor del objeto ningn otro thread podr ejecutar un mtodo synchronized. o Un thread sale del monitor cuando libera el flag de bloqueo del objeto. o Un ejemplo tpico del uso de monitores es el esquema de productor/consumidor. o Aqu el productor y el consumidor son threads que acceden a la regin critica que es la tubera o buffer. Esta tiene que tener sus mtodos protegidos mediante synchronized y tiene que hacer que los threads se comuniquen mediante wait(), notify() y notifyAll().

18

IX. CONCLUSIONES: java, que nos brinda la oportunidad de realizar distintas acciones, en tiempo compartido, Tambin conocido en java como hilos o subprocesos Un thread es un contexto de ejecucin, proceso ligero o tarea donde hay un flujo secuencial de control y que utiliza los recursos disponibles para un programa. La Mquina Virtual Java (JVM) es un sistema multihilo. La diferencia bsica entre un proceso de Sistema Operativo y un Thread Java es que los hilos corren dentro de la JVM. A este tipo de procesos donde se comparte los recursos se les llama a veces procesos ligeros. Desde el punto de vista de las aplicaciones los hilos son tiles porque permiten que el flujo del programa sea divido en dos o ms partes, La clase Thread es la clase responsable de producir hilos funcionales para otras clases. provoca algunas limitaciones, como bien sabemos JAVA no admite la herencia mltiple, para ello, debemos implementar la interfaz runnable. Para lograr aadir la funcionalidad de Hilo a una clase que deriva de otra clase, siendo sta distinta de Thread se utiliza la interfaz Runnable. Las clases que implementan la interfaz Runnable proporcionan un mtodo run que es ejecutado por un objeto hilo asociado que es creado aparte. La clase de error ThreadDeath proporciona un mecanismo que permite hacer limpieza despus de que un hilo haya sido finalizado de forma asncrona deriva de la clase Error. La clase ThreadGroup se utiliza para manejar un grupo de hilos de modo conjunto El mtodo wait hace que el hilo de ejecucin espere en estado dormido hasta que se le notifique que contine. Del mismo modo, el mtodo notify informa a un hilo en espera de que contine con su ejecucin. El mtodo notifyAll es similar a notify excepto que se aplica a todos los hilos en espera. Todo subproceso o hilo en java tiene una prioridad en el rango entre Thread.MIN_PRIORITY (una constante de 1) y Thread.MAX_PRIORITY (una constante de 10).

19