Publicado el 12 de Junio del 2018
883 visualizaciones desde el 12 de Junio del 2018
133,0 KB
24 paginas
Creado hace 12a (21/06/2012)
Tema 12
Hilos en Java
Procesos e Hilos
En la programación concurrente, hay dos unidades básicas de ejecución: procesos
e hilos. En el lenguaje de programación Java, la programación concurrente está
más relacionada con los hilos. Sin embargo, los procesos también son
importantes.
Un Proceso es un ambiente de ejecución autocontenido. Por lo general tiene
recursos de ejecución completos y privados, en particular cada proceso tiene su
propio espacio de memoria.
A veces se ve a los procesos como sinónimo de programas o aplicaciones. Sin
embargo, una aplicación puede ser un conjunto de procesos cooperativos. Para
facilitar la comunicación entre procesos, la mayoría de los sistemas operativos
soportan recursos de Comunicación entre Procesos, IPC, como tubos y sockets.
IPC no sólo se usa para comunicar procesos en un solo sistema sino procesos en
diferentes sistemas.
Un Hilo, llamado a veces proceso ligero, provee también un ambiente de
ejecución. Pero crear un nuevo hilo requiere de menos recursos que crear un
nuevo proceso.
Los hilos existen dentro de los procesos – cada proceso tiene al menos un hilo. Un
proceso con un solo hilo tiene las siguientes propiedades:
• El proceso empieza su ejecución en un punto bien conocido. En los
programas como C, C++ o Java el proceso empieza su ejecución en la
primera sentencia del método main().
• La ejecución de las sentencias sigue una secuencia predefinida
completamente ordenada para un conjunto de entradas.
• Durante la ejecución, el proceso tiene acceso a ciertos datos. En Java hay
tres tipos de datos a los que un proceso puede acceder: variables locales
que se encuentran en la pila del hilo. Variables de instancia que se accesan
mediante referencias y variables estáticas que se acceden mediante clases
o referencias a objetos.
ITSON
Manuel Domitsu Kono
430
Hilos en Java
En la figura 11.1 se ilustra un ejemplo de un sistema multitarea, en el cual hay
varias aplicaciones en ejecución. Cada uno de ellos con un solo hilo de ejecución.
En este caso tenemos varios procesos ejecutándose simultáneamente.
Figura 12.1
Aunque para el usuario, los procesos parecen estar ejecutándose
simultáneamente, esto solo puede ocurrir en un sistema con varios procesadores
o con un procesador con varios núcleos de ejecución. En el caso de un sistema
con un solo procesador mononúcleo, la apariencia de ejecución simultánea se
logra compartiendo el procesador entre los diferentes procesos asignándole a
cada uno de ellos una ranura de tiempo y cambiando a ejecutar otro proceso
cuando el tiempo de la ranura se ha agotado.
En un sistema multitarea que soporta multihilos, los hilos comparten los recursos
de un proceso, incluyendo la memoria y los archivos abiertos. Esto hace la
comunicación eficiente pero potencialmente problemática. En este caso cada
proceso puede tener uno o más hilos. Los diferentes procesos y sus hilo pueden
ejecutarse simultáneamente en forma real o aparente, dependiendo del número de
procesadores o núcleos.
En un proceso, los hilos múltiples tienen las siguientes propiedades:
• Cada hilo empieza su ejecución en un punto bien conocido. Para alguno de
esos hilos ese punto es la primera sentencia del método main(). Para el
resto de los hilos, el programador decide ese punto al codificar el hilo.
• Cada hilo ejecuta su código desde su punto inicial en una forma ordenada y
predefinida para un conjunto de entradas.
• Cada hilo ejecuta su código independientemente de los otros hilos en el
programa. Si se requiere existen mecanismos para que los hilos cooperen
entre sí.
• Los hilos aparentar ejecutar con cierto grado de simultaneidad.
• Los hilos tienen acceso a varios tipos de datos. Cada hilo tiene sus propias
variables locales. Los hilos pueden compartir las variables de instancia. Los
hilos comparten en forma automática a las variables estáticas.
ITSON
Manuel Domitsu Kono
Tema 12
Hilos en Java
431
En la figura 12.2 se ilustra un ejemplo de un sistema multitarea, en el cual hay
varias aplicaciones en ejecución. Cada uno de ellos puede tener varios hilos de
ejecución. En este caso, uno de esos procesos es la máquina virtual de java.
Figura 12.2
La ejecución multihilo es una característica esencial de la plataforma de Java.
Cada aplicación tiene al menos un hilo o varias si se cuentan los hilos del sistema
que administran la memoria y el manejo de las señales. Pero desde el punto de
vista del programador se empieza con un hilo, llamado el hilo principal. Este hilo
tiene la habilidad de crear hilos adicionales como se verá más adelante.
La API de Java para Hilos
Para comprender el funcionamiento de un programa multihilo veamos primero un
programa con un solo hilo de ejecución. Considere el el siguiente programa
formado por dos clases:
Hilo.java
public class Hilo {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i + ": Hola");
}
}
}
ITSON
Manuel Domitsu Kono
432
Hilos en Java
Prueba.java
public class Prueba {
public static void main(String[] args) {
Hilo hilo = new Hilo();
hilo.run();
}
}
En la figura 12.3 se muestra el comportamiento del programa con el tiempo. En
este caso como sólo hay un hilo de ejecución las sentencias se ejecutan una
después de la otra. No hay concurrencia.
Figura 12.3
Hilo.java
Para hacer que el método run() ejecute en paralelo con el método main() y
otros métodos de la clase Prueba, hay que modificar la clase Hilo para que sea
ejecutado por un nuevo hilo. Para ello nuestra clase Hilo deberá heredar de la
clase Thread. Como se muestra en el siguiente código:
public class Hilo extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(I + ": Hola");
}
}
}
También debemos modificar a la clase que invoca a la clase Hilo para que en
lugar de invocar a su método run() invoque a su método start().
Prueba.java
ITSON
Manuel Domitsu Kono
Tema 12
Hilos en Java
433
public class Prueba {
public static void main(String[] args) {
Hilo hilo = new Hilo();
hilo.start();
}
}
El método start() es quien crea otro hilo de ejecución. Este hilo, después de un
proceso de inicialización invoca al método run(). Este mismo hilo, cuando el
método run() completa se encarga de ños detalles de terminación del hilo. El
método start() del hilo original regresa inmediatamente, por lo que el método
run() ejecutará en el nuevo hilo al mismo tiempo que el método start()
regresa en el primer hilo como se muestra en la figura 12.4.
Figura 12.4
La clase Thread forma parte de la API de Java para hilos. Parte de esa API se
muestra en la figura 12.5.
Tabla 12.1 Atributos de la Clase Thread
public static final int MAX_PRIORITY
La máxima prioridad que puede tener un hilo
public static final int MIN_PRIORITY
La mínima prioridad que puede tener un hilo
public static final int NORM_PRIORITY
La prioridad por ausencia, que puede tener un hilo
ITSON
Manuel Domitsu Kono
434
Hilos en Java
Figura 12.4
Tabla 12.2 Métodos de la Clase Thread.
public Thread()
public Thread(Runnable target)
public Thread(Runnable target, String name)
public Thread(String name)
Crean nuevos hilos. El parámetro target denota el objeto del cual se ejecuta el método run().El
valor por omisión es null. El parámetro name establece el nombre del nuevo hilo. El valor
prestablecido es “Thread-“n, donde n es un entero consecutivo.
public void start()
Hace que este hilo inicie su ejecución; La máquina virtual de Java llama al método run() de este
hilo. Como resultado hay dos hilos ejecutándose concurrentemente. El hilo actual (que regresa de
la llamada al método start() y el otro hilo (que ejecuta su método run()).
Es ilegal iniciar un hilo más de una vez. En particular un hilo no puede reiniciarse una vez que
completa su ejecución.
Lanza:
public void run()
Si este hilo fue construido usando un objeto Runnable diferente, entonces se invoca al método
run() del objeto. De otra forma, el método no hace nada y regresa.
IllegalThreadStateException – Si el hilo ya ha sido iniciado.
ITSON
Manuel Domitsu Kono
Tema 12
Hilos en Java
435
Hilos Usando la Interfaz Runnable
Hay ocasiones en que crear un hilo heredando de la clase Thread no es
conveniente. Por ejemplo, si la clase que deseamos que sea un hilo, es una
subclase, no podemos hacer que herede de la clase Thread ya que una clase
sólo puede heredar de una clase. En estos casos, en vez de hacer que la clase
herede de la clase Thread haremos que la clase implemente la interfaz
Runnable, como se muestra en el siguiente código:
HiloRunnable.java
public class HiloRunnable implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i + ": Hola desde la clase Hilo");
}
}
}
Una clase que implemente la interfaz debe implementar el método run(). Sin
embargo para crear un nuevo hilo no es suficiente con crear una instancia de la
clase que implementa la interfaz Runnable e invocar a su método start() ya
que la clase no hereda de la clase Thread y no tiene el método start(). En
lugar de ello crearemos un nuevo hilo y le pasaremos al constructor de la clase
Thread la instancia de la clase que implementa la interfaz Runnable, como se
muestra en el siguiente código:
PruebaHiloRunnable.java
public class PruebaHiloRunnable {
public static void main(String[] args) {
Runnable hiloRunnable = new Hilo();
Thread hilo = new Thread(hiloRunnable);
hilo.start();
}
}
La razón para pasarle un objeto Runnable al constructor de la clase Thread es
para que el hilo tenga a
Comentarios de: Tema 12 - Hilos en Java (0)
No hay comentarios