PDF de programación - Tema 12 - Hilos en Java

Imágen de pdf Tema 12 - Hilos en Java

Tema 12 - Hilos en Javagráfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf11793

Comentarios de: Tema 12 - Hilos en Java (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad