You are on page 1of 8

Multitarea

Los programas multihilo tienen dos o ms partes que pueden


ejecutarse de manera simultnea o concurrente. Cada parte del
programa se llama hilo y cada hilo sigue un camino diferente. Esta
programacin es una manera especializada de multitarea. Hay dos
tipos, a travs de procesos y atreves de hilos. Ambas son diferentes un
proceso es un programa que se est ejecutando, entonces la
multitarea que se

basa en procesos es la capacidad

de

las

computadoras de ejecutar varios programas a la vez, el programa es la


unidad ms pequea que el sistema de computo puede manejar.
La multitarea que se basa en hilos, el hilo es la unidad de cdigo
ms pequeo que se puede gestionar, es decir un programa es capaz
de ejecutar dos o ms tareas en simultneo. La multitarea que se basa
en hilos tiene un menor costo de operacin que las basadas en
procesos. Los procesos requieren de ms recursos y necesitan espacio
de direccionamiento propio. La comunicacin con procesos es costosa
y limitada. Intercambiar contextos de procesos tambin es costoso,
mientras que los hilos son ligeros, comparten el mismo espacio de
direccionamiento y el mismo proceso. Los programas de Java usan
entornos multitarea basados en procesos, pero esto no est bajo
control de Java. La multitarea de hilos si esta al control de Java, la
multitarea que se basa en hilos permite escribir programas eficientes
que usan ptimamente el CPU.

Ciclo de vida de un hilo (Thread)


El ciclo de vida de un hilo representa los estados por los cuales
puede pasar este desde que nace hasta que muere. Durante su ciclo
de vida, se puede encontrar en diferentes estados. La figura siguiente
muestra estos estados y los mtodos que provocan el paso de un
estado a otro.

1. Nuevo: se ha creado el objeto hilo pero todava no se ha arrancado,


por lo que no se puede ejecutar.
2. Ejecutable: Significa que el hilo puede ponerse en ejecucin cuando
el mecanismo de reparto de tiempos de UCP tenga ciclos disponibles
para el hilo. Por consiguiente, el hilo podra estar o no en ejecucin,
pero no hay nada para evitar que sea ejecutado si el planificador as lo
dispone; no est ni muerto ni bloqueado.
3. Muerto: la forma normal de morir de un hilo es que finalice su
mtodo run( ). Tambin se puede llamar a stop( ), pero esto lanza una
excepcin que es una subclase de Error (lo que significa que no hay
obligacin de poner la llamada en un bloque by). Recurdese que el
lanzamiento de una excepcin debera ser un evento especial y no
parte de la ejecucin normal de un programa; por consiguiente, en Java
2 se ha abolido el uso de stop( ). Tambin hay un mtodo destroy ( )
(que jams se implement) al que nunca habra que llamar si puede
evitarse, puesto que es drstico y no libera bloqueos sobre los objetos.
4. Bloqueado: podra ejecutarse el hilo, pero hay algo que lo evita.
Mientras un hilo est en estado bloqueado, el planificador simplemente
se lo salta y no le cede ningn tipo de UCP Hasta que el hilo no vuelva
al estado ejecutable no har ninguna operacin.
Manejo de prioridades
Para determinar que hilo debe ejecutarse primero, cada hilo
posee su propia prioridad: un hilo de prioridad ms alta que se
encuentre en el estado LISTO entrara antes en el estado EN EJECUCION
que otro de menor prioridad. El planificador de hilos usa las prioridades
de estos para poder decidir cundo se va a permitir la ejecucin de
cada uno. Los hilos que tienen prioridad ms alta tienen mayor tiempo

del CPU que los de prioridad baja. Los de prioridad alta pueden
desalojar a uno de prioridad ms baja.
Por ejemplo, cuando el de prioridad ms baja se esta ejecutando
y otro de prioridad ms alta reanuda su ejecucin, este segundo
desalojar al de prioridad ms baja. Los hilos con la misma prioridad
tienen el mismo acceso al CPU. Para establecer la prioridad de un hilo
se utiliza setPriority(), que es miembro de la clase Thread. Su forma
general es: final void setPriority(int nivel) en donde el nivel es la
nueva prioridad del hilo, el valor del nivel debe de estar entre
MIN_PRIORITY y MAX_PRIORITY. Actualmente estos valores son 1 y 10.
Para establecer la prioridad por default que tienen los hilos de nuevo
se usa NORM_PRIORITY, es 5, para obtener la prioridad de un hilo
usamos getPriority() de Thread: final int getPriority
Sincronizacin de hilos
Todos los hilos comparten el mismo espacio de direcciones y
otros

recursos

como

pueden

ser

archivos

abiertos.

Cualquier

modificacin de un recurso desde un hilo afecta al entorno del resto de


los hilos del mismo proceso. Por lo tanto, es necesario sincronizar la
actividad de los distintos hilos para que no interfieran unos con otros o
corrompan estructuras de datos. Una ventaja de la programacin
multihilo es que los programas operan con mayor velocidad en
sistemas

de

computadores

con

mltiples

CPUs

(sistemas

multiprocesador o a travs de grupo de mquinas) ya que los hilos del


programa se prestan verdaderamente para la ejecucin concurrente.
En tal caso el programador necesita ser cuidadoso para evitar
condiciones de carrera (problema que sucede cuando diferentes hilos o
procesos alteran datos que otros tambin estn usando), y otros
comportamientos no intuitivos, el descuido de esto puede generar
interbloqueo
Objetos Runnable
La manera ms fcil de crear un hilo es creando una clase que
implemente la interfaz Runnable, se puede construir un hilo desde

cualquier objeto que implementa esta interfaz. La clase necesita


implementar el mtodo run(), que se declara as: public void run()
Dentro del mtodo run(), se escribe el cdigo que definir un nuevo
hilo. Despus de crear la clase, se crea el objeto de tipo Thread: Thread
(Runnable objeto Hilo, String nombre Hilo) El nuevo hilo que se cre no
empezar su interfaz hasta que se llame al metodo start(), start()
ejecuta una llamada al mtodo run(): void start()
Agrupacin de hilos.
Veamos, por ejemplo, el problema clsico de las colas, donde uno de
los hilos produce datos y otros consume. Para que el problema sea as
interesante supongamos que el productor tiene que esperar a que el
consumidor haya terminado, para empezar a producir ms datos. En
un sistema basado en sondeo el consumidor estara desperdiciando
ciclos de CPU mientras espera a que el productor produzca. Una vez
que el productor ha terminado, se queda sondeando hasta ver que el
consumidor

ha

finalizado,

as

sucesivamente.

Evidentemente, hay una forma mejor de hacerlo. Java proporciona un


mecanismo elegante de comunicacin entre procesos, a travs de los
mtodos wait, notify y notifyAll. Estos mtodos se implementan como
mtodos de final Object, de manera que todas las clases disponen de
ellos. Cualquiera de los tres mtodos solo puede ser llamado desde
dentro

de

un

mtodo

synchronized.

Wait: le indica al hilo en curso que abandone el monitor y se vaya a


dormir hasta que el otro hilo entre en el mismo monitor y llame al
notify.
Notify: despierta al primer hilo que realizo una llamada a wait sobre el
mismo

objeto

notifyAll_: despierta todos los hilos que realizaron una llamada a wait
sobre el mismo objeto. El hilo con mayor prioridad de los despertados
es el primero en ejecutarse.
Ejemplos de multitarea
import java.util.Calendar;
import java.util.logging.Level;

import java.util.logging.Logger;
public class EjemploTreah implements Runnable{
@Override
public void run() {
while(true) {
try {
Calendar cal=Calendar.getInstance();
System.out.println(
cal.get(Calendar.HOUR)+
":"+cal.get(Calendar.MINUTE)+":"
+cal.get(Calendar.SECOND));
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(
EjemploTreah.class.getName())
.log(Level.SEVERE,
null,
ex);
}
}
}
public static void main(String arg[]){
Thread th= new Thread(new EjemploTreah());
th.start();
System.out.print("Seguimos con la "
+ "ejecucion del Programa Mientras "
+ "se ejecuta el Hilo ");
}

A continuacin se presenta un ejemplo en java, que implementa


el interfaz Runnable para crear un programa multihilo.

class java1001 {
static public void main( String args[] ) {
// Se instancian dos nuevos objetos Thread
Thread hiloA = new Thread( new MiHilo(),"hiloA" );
Thread hiloB = new Thread( new MiHilo(),"hiloB" );
// Se arrancan los dos hilos, para que comiencen su ejecucin
hiloA.start();
hiloB.start();
// Aqu se retrasa la ejecucin un segundo y se captura la
// posible excepcin que genera el mtodo, aunque no se hace
// nada en el caso de que se produzca
try {
Thread.currentThread().sleep( 1000 );
}catch( InterruptedException e ){}
// Presenta informacin acerca del Thread o hilo principal

// del programa
System.out.println( Thread.currentThread() );
// Se detiene la ejecucin de los dos hilos
hiloA.stop();
hiloB.stop();
}
}
class NoHaceNada {
// Esta clase existe solamente para que sea heredada por la clase
// MiHilo, para evitar que esta clase sea capaz de heredar la clase
// Thread, y se pueda implementar el interfaz Runnable en su
// lugar
}
class MiHilo extends NoHaceNada implements Runnable {
public void run() {
// Presenta en pantalla informacin sobre este hilo en particular
System.out.println( Thread.currentThread() );
}
}
Como se puede observar, el programa define una clase MiHilo que
extiende a la clase NoHaceNada e implementa el interfaz Runnable. Se
redefine el mtodo run() en la clase MiHilopara presentar informacin
sobre el hilo.
La nica razn de extender la clase NoHaceNada es proporcionar un
ejemplo de situacin en que haya que extender alguna otra clase,
adems de implementar el interfaz.
En el ejemplo 2 muestra el mismo programa bsicamente, pero en este
caso extendiendo la clase Thread, en lugar de implementar el
interfaz Runnable para crear el programa multihilo.
class java1002 {
static public void main( String args[] ) {
// Se instancian dos nuevos objetos Thread
Thread hiloA = new Thread( new MiHilo(),"hiloA" );
Thread hiloB = new Thread( new MiHilo(),"hiloB" );
// Se arrancan los dos hilos, para que comiencen su ejecucin
hiloA.start();
hiloB.start();
// Aqu se retrasa la ejecucin un segundo y se captura la
// posible excepcin que genera el mtodo, aunque no se hace
// nada en el caso de que se produzca
try {
Thread.currentThread().sleep( 1000 );

}catch( InterruptedException e ){}


// Presenta informacin acerca del Thread o hilo principal
// del programa
System.out.println( Thread.currentThread() );
// Se detiene la ejecucin de los dos hilos
hiloA.stop();
hiloB.stop();
}
}
class MiHilo extends Thread {
public void run() {
// Presenta en pantalla informacin sobre este hilo en particular
System.out.println( Thread.currentThread() );
} }
En ese caso, la nueva clase MiHilo extiende la clase Thread y no
implementa el interfaz Runnabledirectamente (la
clase Thread implementa el interfaz Runnable, por lo que
indirectamente MiHilotambin est implementando ese interfaz). El
resto del programa es similar al anterior.

REPUBLICA BOLIVARIANA DE VENEZUELA


INSTITUTO UNIVERSITARIO POLITECNICO
SANTIAGO MARIO
EXTESION MATURIN

ARCHIVO DE JAVA

Profesora:
Diana Garca

Bachiller:
Yonmar Guevara
Jetzimar Sousa
Gleyvert Lagos

Maturn, Noviembre 2015

You might also like