Sunteți pe pagina 1din 13

APLICACIONES

MULTIHILOS

Que es un hilo?

Conocidos tambin como procesos ligeros.

Un hilo (thread) es un flujo de ejecucin secuencial dentro de un


proceso.

Un mismo proceso java puede tener


a). Un nico hilo (el hilo principal) y por tanto se le llama
monotarea.
b). Varios hilos (por ejemplo el hilo principal y el de gestin de
eventos). Y por tanto se le llama monotarea.

Ciclo d vida de un Hilo

Clase principal para manejo de


Hilos
La clase principal para el manejo de los hilos (Treads)es:
java.lang.Thread
Nos ofrece el API genrico de los threads as como la
implementacin de su comportamiento, incluyendo los mtodos:

Run

Sleep

Wait

Crear un Hilo
heredando la clase java.lang.Thread

Implementando de la interfaz java.lang.Runnable

Mtodo Run
El mtodo Run se utiliza para indicar el cdigo a ejecutar de un hilo.
La clase java.lang.Thread contiene un mtodo run() vaco.
public void run(){
//Contenido del Hilo
}

Mtodo Sleep
Se trata de un mtodo esttico que, al ser invocado, pone a
dormir el thread en ejecucin durante los milisegundos
especificados en el argumento.
public static void sleep(milisegundos)

Mtodo Join
El mtodo join() de la clase Thread permite a un hilo unirse al final de
otro hilo. Si tenemos un hilo B que no puede hacer su trabajo hasta que
otro hilo A haya completado el suyo, entonces querremos que el hilo B
haga un join con A. Esto significa que B no serrunnablehasta que A
haya terminado (y entrado en el estadodead).

El cdigo anterior toma el hilo actual en ejecucin y lo une al final del


hilo referenciado por 't.
Esto bloquea el hilo actual de volverserunnablehasta que el hilo 't'
deje de estar vivo.

Mtodo Yield
El mtodo esttico Thread.yield() hace que el hilo actual en ejecucin permita que
otros hilos con la misma prioridad obtengan su turno.
El mtodo har que vaya derunningarunnable.
Para comprender yield() debemos comprender el concepto de prioridades de hilos. Los
hilos siempre se ejecutan con una prioridad, normalmente entre 1 y 10. En la mayora
de los casos, el hilo en ejecucin tendr una prioridad igual o mayor que el hilo con
mayor prioridad en espera.
El comportamiento del planificador de hilos no est garantizado, por lo que las
prioridades deben usarse para mejorar la eficiencia de nuestro programa, sin hacer
que el programa dependa de dicho comportamiento.
Cuando los hilos tienen la misma prioridad pueden ocurrir 2 cosas:

Tomar un hilo para ejecutarlo y ejecutarlo hasta que se bloquee o complete.

Hacer un reparto de tiempos entre los hilos dndole a todos la misma oportunidad
de ejecutarse.

Mtodo Notify
Para enviar una seal a los threads que estn esperando en el
objeto desde donde enviamos la seal se utiliza el mtodo:
public void notify();
public void notifyAll();
El mtodo notify() elige un thread que est esperando y lo
despierta.

Mtodo Wait
El mtodo wait() hace que el thread actual espere, hasta que otro
thread se lo notifique. Se utiliza el mtodo wait() en conjuncin con
el mtodo notify() para coordinar la actividad de varios threads que
utilizan los mismos recursos.

Uso de synchronized
Cuando en un programa tenemos varios hilos corriendo simultneamente es posible que
varios hilos intenten acceder a la vez a un mismo sitio y es posible que la operacin de uno
de ellos entorpezca la del otro. Para evitar estos problemas, hay que sincronizar los hilos.
Imagina que escribimos en un fichero usando una variableficherode tipoPrintWriter.
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 debemossincronizarlos 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 ponersynchronized(fichero)marcamosficherocomo ocupado desde que se abren las
llaves de despus hasta que se cierran. Cuando el segundo hilo intenta tambin
susynchronized(fichero), se queda ah bloqueado, en espera que de que el primero
termine confichero.

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