Publicado el 10 de Julio del 2018
541 visualizaciones desde el 10 de Julio del 2018
100,1 KB
19 paginas
Creado hace 14a (24/06/2009)
Hilos
BUAP
Introducción
Normalmente, los programas son ejecutados de
forma secuencial
Único flujo de control
Un programa con un único flujo de control, ejecuta
sólo una tarea (hilo)
Dr. Ivan Olmos
2
Introducción
Históricamente, los sistemas de cómputo
personales sólo han tenido un único CPU
Al volverse más poderosos los CPU, se
desarrolló
S. O. multitarea / multiproceso
Programación multitarea (multihilo), multiproceso
Programación (pseudo)concurrente
Dr. Ivan Olmos
3
Hilos
Un hilo (thread) es un flujo de control
secuencial dentro de un programa
public class Hola_Mundo {
public static void main(String[] args) {
System.out.println("Hola Mundo\n");
}
}
Una aplicación de control único realiza su tarea ejecutando subtareas
de forma secuencial
Dr. Ivan Olmos
4
Hilos
Un programa puede generar dos o más hilos
de ejecución, los cuales siempre dependerán
de la aplicación principal
P. E. Imprimir diferentes mensajes desde una
aplicación principal
Programa
Principal
Hola Mundo 1
Hola Mundo 2
Hola Mundo 3
Dr. Ivan Olmos
5
Características Generales de
los Hilos
Típicamente, las tareas controlan un único
aspecto dentro de un programa
Todas las tareas comparten los mismos
recursos
Aplicación Java
Thread 1
Thread 2
Thread 3
Dr. Ivan Olmos
6
Multitarea vs. Multiproceso
Multiproceso: dos
programas se
ejecutan
“aparentemente” a la
vez, sin necesidad
de tener una relación
entre ellos
Multitarea: dos o
más tareas se
ejecutan a la “vez”
dentro de un mismo
programa
Dr. Ivan Olmos
7
Ejemplo
class TestHilos extends Thread{
private String nombre;
private int retardo;
//constructor
public TestHilos(String s, int d){
nombre = s;
retardo = d;
}
//funcion para la ejecucion del hilo
public void run(){
try{
sleep(retardo);
} catch(InterruptedException e){
;
}
System.out.println("hola mundo " + nombre + " " + retardo);
}
}
public class hilos {
public static void main(String[] args) {
TestHilos t1,t2,t3;
t1 = new TestHilos("hilo_1",(int)(Math.random()*2000));
t2 = new TestHilos("hilo_2",(int)(Math.random()*2000));
t3 = new TestHilos("hilo_3",(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();
}
}
Dr. Ivan Olmos
8
Programación con
Hilos en Java
Introducción
Java permite la ejecución de diferentes hilos
a partir de clases derivadas de la clase
Thread, o bien a través de la implementación
de la clase Runnable
Thread
Métodos de Clase
Métodos de Instancia
Dr. Ivan Olmos
10
Métodos de Clase
currentThread()
Devuelve el objeto Thread que representa a la
tarea que se esta ejecutando actualmente
yield()
sleep(long)
Permite permutar la ejecución de la tarea actual y
la siguiente tarea ejecutable disponible
Provoca que la tarea en curso entre en pausa
durante un número de milisegundos indicado por
“long”
Dr. Ivan Olmos
11
Métodos de Instancia
Indica al interprete de java iniciar una tarea.
Inmediatamente se invoca al método run()
Cuerpo de una tarea o hilo de ejecución. Es llamado por el
start()
run()
método start()
stop()
suspend()
Detiene la ejecución de una tarea y la destruye
Detiene la ejecución sin destruir la tarea de sistema
subyacente ni el estado de la tarea anteriormente en
ejecución
Dr. Ivan Olmos
12
Métodos de Instancia
resume()
setPriority(int)
getPriority()
setName(String)
getName()
a la tarea
Utilizada para revivir una tarea suspendida, aunque no se
garantiza que se inicie su ejecución de forma inmediata
Asigna la prioridad indicada por “int” a una tarea (rango de
valores: 1, …, 10). Existen constantes predefinidas como
“MIN_PRIORITY”, “NORM_PRIORITY”, “MAX_PRIORITY”
Devuelve la prioridad de una tarea en curso
Permite identificar a una tarea a través de un nombre
Devuelve el valor actual de tipo cadena asignado como nombre
Dr. Ivan Olmos
13
Creación de Tareas en Java
Extender la clase Thread
Implementación de la
clase Runnable
class TestHilos extends Thread{
public void run(){
. . .
}
}
•Ventaja: hereda todos los métodos
y variables de la clase Thread
•Desventaja: sólo se pueden
extender o derivar una vez de la
clase Thread
public class TestHilos implements Runnable{
Thread t;
public void run(){
. . .
}
}
•Ventaja: hereda todos los métodos
y variables de la clase Thread;
además permite heredar la clase
base a otras clases
Dr. Ivan Olmos
14
Ejemplo 1: Runnable
class NoHaceNada{
}
class MiHilo extends NoHaceNada implements Runnable{
private String nombre;
private int retardo;
public MiHilo(String s, int d){
nombre = s;
retardo = d;
}
public void run(){
try{
Thread.currentThread().sleep(retardo);
} catch (InterruptedException e){}
System.out.println("hola Mundo! " + nombre + " " + retardo
+ " " + Thread.currentThread());
}
}
public class Hilo2 {
public static void main(String[] args) {
Thread hiloA = new Thread(new MiHilo("Hilo1",
(int)(Math.random()*2000)), "hiloA");
Thread hiloB = new Thread(new MiHilo("Hilo2",
(int)(Math.random()*2000)), "hiloB");
hiloA.start();
hiloB.start();
try{
Thread.currentThread().sleep( 1000 );
} catch (InterruptedException e){}
System.out.println(Thread.currentThread());
}
}
Dr. Ivan Olmos
15
Ejemplo 2: Thread
class MiHilo extends Thread{
private String nombre;
private int retardo;
//constructor
public MiHilo(String s, int d){
nombre = s;
retardo = d;
}
}
public void run(){
try{
Thread.currentThread().sleep(retardo);
} catch (InterruptedException e){}
System.out.println("hola mundo! " + nombre + "
" + retardo + " " + Thread.currentThread());
}
public class Hilos3 {
public static void main(String[] args) {
Thread hiloA = new Thread(new MiHilo("hiloA",(int)
(Math.random()*2000)),"hiloA");
Thread hiloB = new Thread(new MiHilo("hiloB",(int)
(Math.random()*2000)),"hiloB");
hiloA.start();
hiloB.start();
try{
Thread.currentThread().sleep(1000);
} catch(InterruptedException e){}
System.out.println(Thread.currentThread());
}
}
Dr. Ivan Olmos
16
Ejemplo 3:
class TestHilos extends Thread{
private String nombre;
private int retardo;
//constructor
public TestHilos(String s, int d){
nombre = s;
retardo = d;
}
//funcion para la ejecucion del hilo
public void run(){
try{
sleep(retardo);
} catch(InterruptedException e){
;
}
System.out.println("hola mundo " + nombre + " " + retardo);
}
}
public class hilos {
public static void main(String[] args) {
TestHilos t1,t2,t3;
t1 = new TestHilos("hilo_1",(int)(Math.random()*2000));
t2 = new TestHilos("hilo_2",(int)(Math.random()*2000));
t3 = new TestHilos("hilo_3",(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();
}
}
Dr. Ivan Olmos
17
Sincronización de Hilos
Cuando se trabaja con hilos, es común
realizar tareas de sincronización para:
Determinar cuando un hilo puede operar sobre
los datos comunes
Tomar como entrada de un hilo la salida de otro
hilo
Recursos compartidos
Dr. Ivan Olmos
18
Sincronización de Hilos
Para sincronizar hilos es importante utilizar
las funciones:
wait: esperar por un evento – notify
notify: avisa a cualquier proceso que esté en
espera por un objeto específico
Analizar el ejemplo de sincronización
propuesto
Dr. Ivan Olmos
19
Comentarios de: Hilos (0)
No hay comentarios