Publicado el 20 de Abril del 2018
1.186 visualizaciones desde el 20 de Abril del 2018
434,3 KB
43 paginas
Creado hace 10a (13/02/2014)
MANUAL DE JAVA
Autor:
Lic. Jorge Herrero
Introducción a Threads
¿Qué es un Thread? (Hilo de Ejecución).
Un concepto fundamental en programación es manejar más de una tarea a la vez.
Muchos problemas de programación requieren que el programa pueda detener lo que esté
haciendo, tratar con algún otro problema y regresar al proceso principal.
Dentro de un programa, las partes que corren separadamente se llaman hilos (Thread) y
el concepto general se llama Multithreading.
Ordinariamente, los hilos son una manera de asignar el tiempo de un solo procesador.
Pero si el sistema operativo apoya procesadores múltiples, cada hilo puede asignarse a un
procesador diferente y ellos pueden correr realmente en paralelo. Una de las características
convenientes de Multithreading es que el programador no necesita preocupar sobre si existe
uno o más procesadores. El programa es lógicamente dividido en hilos y si la maquina tiene más
de un procesador entonces el programa corre más rápidamente, sin necesidad de ajuste
especial.
¿Qué es un proceso?
Un proceso es un programa ejecutándose en forma independiente y con un espacio
propio de memoria. Un Sistema Operativo multitarea es capaz de ejecutar más de un proceso
simultáneamente. Un Thread o hilo es un flujo secuencial simple dentro de un proceso. Un
único proceso puede tener varios hilos ejecutándose. Por ejemplo, los programas Firefox,
Internet Explorer, Google Chrome serían un proceso, mientras que cada una de las ventanas
y/o pestañas que se pueden tener abiertas simultáneamente trayendo páginas HTML estaría
formada por al menos un (1) hilo.
Un sistema multitarea da realmente la impresión de estar haciendo varias cosas a la vez
y eso es una gran ventaja para el usuario. Sin el uso de hilos hay tareas que son prácticamente
imposibles de ejecutar, particularmente las que tienen tiempos de espera importantes entre
etapas.
Los Threads o hilos de ejecución permiten organizar los recursos de la PC de forma que
pueda haber varios programas actuando en paralelo. Un hilo de ejecución puede realizar
cualquier tarea que pueda realizar un programa normal y corriente. Bastara con indicar lo que
tiene que hacer en el método run(), que es el que define la actividad principal de las tareas.
¿Qué significa Multi-Threading?
La Máquina Virtual Java (JVM) es un sistema multi-thread. Es decir, es capaz de ejecutar
varias secuencias de ejecución (programas) simultáneamente.
La programación multithreading (multi-hilo) permite la ocurrencia simultánea de varios
flujos de control. Cada uno de ellos puede programarse independientemente y realizar un
trabajo, distinto, idéntico o complementario, a otros flujos paralelos.
Un procesador ejecuta las instrucciones secuencialmente una después de la otra. A esta
ejecución secuencial de instrucciones se le llama un Execution Thread (Hilo de Ejecución).
Multithreading es cuando se están ejecutando varios hilos simultáneamente.
Si un procesador ejecuta las instrucciones secuencialmente, una después de la otra
¿Cómo hace para ejecutar varios hilos simultáneamente? No puede hacer, pero puede simular
que lo hace.
CREACIÓN DE THREADS
Alternativas de creación
Existen dos modos de crear Hilos en Java:
Extender la clase Thread
Implementar la interface Runnable
Creación a través de la clase Thread
Crear una nueva clase que hereda la clase Thread y redefinir el método run(). (Este
método contendrá el código que va a ser ejecutado por el hilo)
Luego se instancian objetos de la clase derivada y se llama a su método start(). (Así se
arrancan hilos que ejecutan el código contenido en el método run())
El paquete java.lang define una clase Thread que sirve para crear hilos.
Veamos un ejemplo:
/*
Esta clase define el prototipo para presentar mensajes en pantalla cada x segundos
*/
import java.awt.*;
import java.lang.*;
//definimos la clase Hilo derivada de la clase Thread
//así podremos instanciar todos los hilos que queramos
class Hilo extends Thread{
private String s; //para almacenar los mensajes
private int pausa; //pausa antes de presentar el mensaje
//Constructor, se indica el mensaje y la pausa
public Hilo(String m, int p){
s = m;
pausa = p;
}
//Definimos el método run() similar al main()pero para Hilos
//recordar el contenido de Mensaje.java
public void run(){
do{
try{
sleep (pausa*1000);
}catch (InterruptedException e){
;
}
System.out.println(s);
}while (true);
}
}
public class Mensaje{
public static void main(String args[]){
Hilo m1,m2; //instanciamos dos objetos de la clase Hilo
String s1,s2;
s1 = new String("Prueba del 1er Hilo");
s2 = new String("Prueba del 2do Hilo");
//creamos los hilos m1 y m2
m1 = new Hilo(s1,3);
m2 = new Hilo(s2,5);
//arrancamos los hilos
m1.start();
m2.start();
}
}
Creación a través de la interfaz Runnable
El otro modo de crear hilos es mediante la implementación de la interfaz Runnable. La
razón para utilizar otro método para la creación de hilos es que nos puede interesar heredar de
la clase Applet y a la vez emplear los servicios de threads.
En Java no está permitida la herencia múltiple, al menos de clases, la forma de
solucionar este problema es utilizando una interface (lo que sería una clase abstracta pura en
C++) que permita que las clases que implementa la interface puedan ser utilizada por la clase
Thread como base para crear un hilo, la interfaz utilizada se denomina Runnable.
Ya hemos visto la solución concurrente que dimos al problema inicial de presentar en
pantalla dos mensajes sin utilizar applets, utilizamos la clase Hilo derivada de Thread y
mensaje.java como programa principal que hacía uso de dicha clase.
Para poder hacer uso de la concurrencia en un applet es necesario incluir la interfaz
Runnable, tal como hicimos en la solución concurrente con appletes, donde utilizamos la clase
HiloApplet y el applet AppletConcurrent.
Podemos utilizar dos formas de crear Hilos utilizando Applets:
Una consiste en crear clases extendidas de Thread, que contendrá el código de
ejecución del hilo, donde pasamos al constructor una referencia al applet que crea los hilos
mediante this, esto es lo que hemos hecho en AppletConcurrent.java
hilo1 = new HiloApplet(this,pausa1);
hilo2 = new HiloApplet(this,pausa2);
Otra forma consiste en colocar el código de ejecución del hilo en el método run() del
applet y crear los hilos como una instancia de la clase Thread. Esto es lo que hemos hecho en el
applet appletConcurrent2.java
Ejemplo:
public class CreateThreadRunnableExample implements Runnable{
public void run(){
for(int i=0; i < 5; i++){
System.out.println("Hijo Hilo : " + i);
}
try{
}
Thread.sleep(50);
catch(InterruptedException ie){
System.out.println("Hijo del hilo interrumpido! " + ie);
}
System.out.println("Hijo del hilo finalizada!");
}
public static void main(String[] args) {
t.start();
for(int i=0; i < 5; i++){
System.out.println("Main thread : " + i);
try{
}
Thread.sleep(100);
catch(InterruptedException ie){
System.out.println("Child thread interrupted! " + ie);
}
}
System.out.println("Main thread finished!");
MANEJO DE THREADS
}
}
El método start()
Es usado para iniciar el cuerpo del hilo definido por el método run().
Ejemplo:
MiHilo elHilo = new MiHilo();
elHilo.start();
El método run()
Es usado para definir la tarea concurrente a realizar por el (los) hilo(s).
Ejemplo:
public void run() {
// mientras continuar ...
while (continuar) {
String texto = leeDelTeclado();
enviaAlServidor(texto);
}
}
El método join()
Es usado para esperar por el término del hilo sobre la cual el método es invocado, por
ejemplo por término de método run(), “se forma en una cola de espera de otro hilo”.
Ejemplo:
Thread t = new Thread();
t.start();
t.join();
El método yield()
Se encargar de mover un hilo desde el estado de corriendo al final de la cola de procesos
en espera por la CPU.
Ejemplo:
public class CD_PrimerThread extends Thread {
public void run() {
while(true) {
System.out.print("Primer Hilo ");
yield();
}
}
}
public class CD_SegundoThread extends Thread {
public void run() {
while(true) {
System.out.print("Segundo Hilo ");
yield();
}
}
}
El método sleep()
Se encargar de poner a dormir un hilo por un tiempo mínimo especificado.
Ejemplo:
public class Counter
{
public static void main(String[]args)
{
int i;
for (i = 0; i <= 10; i++)
{
Thread.sleep(1000);
System.out.println(i);
}
System.out.println("Espere un momento por favor…");
}
}
El método suspend()
Se encarga de suspender la ejecución de un hilo temporalmente.
Ejemplo:
Thread t = new Thread();
t.suspend();
Comentarios de: Manual de Java (0)
No hay comentarios