Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Concurrente
1
JAVA: Threads
Thread (hiIo, tarea) es Ia cIase base de Java para
definir hiIos de ejecucin concurrentes dentro de
un mismo programa.
En Java, como Ienguaje O.O., eI concepto de
concurrencia est asociado a Ios objetos:
Son los objetos los que actan concurrentemente
con otros.
Las cIases de objetos (hiIos) que puedan actuar
concurrentemente deben extender Ia cIase Thread.
Ejemplo:
class miClaseConcurrente extends Thread {...}
Lenguajes de Programacin - Progr. Concurrente
2
La cIase Thread
Las cIases derivadas de Thread deben de incIuir un
mtodo:
public void run ()
Este mtodo especifica realmente la tarea a realizar.
La ejecucin deI mtodo run de un Thread puede
reaIizarse concurrentemente con otros mtodos
run de otros Thread y con eI mtodo main.
Obj. A
run()
Obj. B
run()
Obj. C
run()
main()
Lenguajes de Programacin - Progr. Concurrente
3
Iniciar una tarea: start
EI inicio de Ia ejecucin de una tarea se reaIiza
mediante eI mtodo start() heredado de Thread.
start() es un mtodo especiaI que invoca a run()
y devueIve inmediatamente eI controI a Ia tarea que
Io ha IIamado.
Lenguajes de Programacin - Progr. Concurrente
4
EjempIo: Lanzar tareas concurrentes en Java
class claseConcurrente extends Thread {
//...mtodos
//...atributos
public void run () {
//sentencias
}
}
class miPrograma {
public static void main (String[] args) {
claseConcurrente tarea1, tarea2;
tarea1 = new claseConcurrente();
tarea2 = new claseConcurrente();
//ms sentencias
tarea1.start();
tarea2.start();
//ms sentencias;
}
La tarea que ser concurrente.
DecIaracin y creacin de
objetos NORMAL
Iniciar tarea1 concurrentemente con main
(). Invoca a tarea1.run() y vueIve
inmediatamente.
Idem para tarea2.
Lenguajes de Programacin - Progr. Concurrente
5
Creacin/Ejecucin de hiIos en Java: Resumen
Un objeto concurrente pertenece a una cIase que
extiende Thread.
Hay que redefinir eI mtodo run() que especifica Ia
tarea concurrente.
La ejecucin de Ia tarea concurrente se reaIiza
mediante eI mtodo start() (heredado de Thread).
Lenguajes de Programacin - Progr. Concurrente
6
EjempIo: HiIo
class Hilo extends Thread {
public Hilo (String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e) {}
}
System.out.println("FIN! " + getName());
}
}
La cIase cuyos objetos pueden
ser concurrentes
La tarea que ser concurrente.
Detiene Ia ejecucin deI
HiIo ("duerme")
Lenguajes de Programacin - Progr. Concurrente
7
EjempIo: Test
public class Demo {
public static void main (String[] args) {
Hilo uno, dos;
uno = new Hilo("Jamaica");
dos = new Hilo("Fiji");
uno.start();
dos.start();
System.out.println("main no hace nada");
}
}
Crear Ios objetos con un
nombre
Arrancar Ios 2 hiIos
Lenguajes de Programacin - Progr. Concurrente
8
EjempIo: Ejecucin
public class Demo {
public static void main (String[] args) {
Hilo uno, dos;
uno = new Hilo("Jamaica");
dos = new Hilo("Fiji");
uno.start();
dos.start();
System.out.println("main no hace nada");
}
}
main no hace nada
0 Jamaica
0 Fiji
1 Jamaica
1 Fiji
2 Jamaica
2 Fiji
3 Jamaica
3 Fiji
4 Fiji
5 Fiji
4 Jamaica
6 Fiji
7 Fiji
5 Jamaica
8 Fiji
6 Jamaica
9 Fiji
7 Jamaica
8 Jamaica
FIN! Fiji
9 Jamaica
FIN! Jamaica
Lenguajes de Programacin - Progr. Concurrente
9
EjempIo: Ejecucin (start/run)
public class Demo {
public static void main (String[] args) {
Hilo uno, dos;
uno = new Hilo("Jamaica");
dos = new Hilo("Fiji");
uno.run();
dos.run();
System.out.println("main no hace nada");
}
}
0 Jamaica
1 Jamaica
2 Jamaica
3 Jamaica
4 Jamaica
5 Jamaica
6 Jamaica
7 Jamaica
8 Jamaica
9 Jamaica
FIN! Jamaica
0 Fiji
1 Fiji
2 Fiji
3 Fiji
4 Fiji
5 Fiji
6 Fiji
7 Fiji
8 Fiji
9 Fiji
FIN! Fiji
main no hace nada
Lenguajes de Programacin - Progr. Concurrente
10
Prioridades
EI criterio para Ia ejecucin de mItipIes hiIos sobre
una CPU se basa en prioridades:
El sistema (JRE) selecciona para ejecutar en cada
instante el hilo (ejecutable) con prioridad ms alta.
A igualdad de prioridad, seleccin arbitraria.
Los hiIos heredan Ia prioridad deI hiIo que Ios crea.
La prioridad se puede cambiar:
void setPriority (long x)
long getPriority ( )
Un hiIo de prioridad baja sIo podr ejecutarse
cuando todos Ios hiIos de prioridad superior pasen
aI estado "No ejecutabIe"
Lenguajes de Programacin - Progr. Concurrente
11
Reparto de tiempo (Time Slicing)
Mtodo de asignacin de tiempo de CPU a
diferentes hiIos de iguaI (o mayor) prioridad.
Cada intervaIo de tiempo (t
i
) se seIecciona un hiIo
a ejecutar en Ia CPU (prioridad >= aI actuaI).
Un hiIo puede ceder su tiempo:
static void yield ( )
1 unidad de tiempo de CPU
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
Lenguajes de Programacin - Progr. Concurrente
12
Reparto de tiempo (Time Slicing) (2)
1 unidad de tiempo de CPU
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
main no hace nada
0 Jamaica
0 Fiji
1 Jamaica
1 Fiji
2 Jamaica
2 Fiji
3 Jamaica
3 Fiji
4 Fiji
5 Fiji
4 Jamaica
6 Fiji
7 Fiji
5 Jamaica
8 Fiji
6 Jamaica
9 Fiji
7 Jamaica
8 Jamaica
FIN! Fiji
9 Jamaica
FIN! Jamaica
Lenguajes de Programacin - Progr. Concurrente
13
CicIo de vida de un "hiIo"
Ejecutable No Ejecutable
Muerto
Nuevo
(reposo)
start
FinaIiza eI mtodo
run
sleep*
yield
Un hiIo est "vivo" si se encuentra en eI estado
"EjecutabIe" o "No ejecutabIe".
boolean isAlive ( )
Puede ejecutarse en la CPU
Lenguajes de Programacin - Progr. Concurrente
14
Definicin de hiIos: Interfaz Runnable
ProbIema: Qu ocurre si se desea hacer
concurrentes Ios objetos de una cIase que hereda de
otra, que no es Thread?
Ejemplo: class Circulo extends Figura {...}
No puede heredar tambin de Thread Java prohbe
la herencia mltiple.
SoIucin: Java admite heredar de 1 soIa cIase pero
impIementar mItipIes interfaces Proporciona un
interfaz para cIases concurrentes
Runnable
Lenguajes de Programacin - Progr. Concurrente
15
UtiIizacin deI interfaz Runnable
Mnimas diferencias respecto aI uso de Thread.
La cIase que se desee hacer concurrente debe de
impIementar Runnable:
class Circulo extends Figura implements Runnable {...}
La cIase debe de impIementar eI mtodo run(),
iguaI que con Thread.
Lenguajes de Programacin - Progr. Concurrente
16
Circulo c = new Circulo();
Thread elHilo = new Thread ( c );
elHilo.start();
UtiIizacin deI interfaz Runnable (2)
EI Ianzamiento de Ia tarea se hace a travs de un
Thread:
No se puede hacer directamente c.start(),
porque c NO es un hiIo (Thread)
Se crea un hiIo de ejecucin y se indica que eI
objeto c se va a ejecutar en I.
Se ejecuta concurrentemente eI mtodo run
deI objeto asociado con eIHiIo.
EI mecanismo es ms indirecto que heredando de
Thread, pero evita eI probIema de Ia herencia
mItipIe.
Lenguajes de Programacin - Progr. Concurrente
17
Revisin EjempIo: HiIo2
class Hilo2 implements Runnable {
private Thread miHilo = null;
public Hilo2 (String str) {
miHilo = new Thread (this, str);
miHilo.start();
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + miHilo.getName());
try {
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e) {}
}
System.out.println("FIN! " + miHilo.getName());
}
}
La cIase impIementa eI interfaz
"EjecutabIe"
La tarea que ser concurrente.
EI Thread sobre eI que se va a
ejecutar
Lenguajes de Programacin - Progr. Concurrente
18
Revisin EjempIo: Test2
public class Demo2 {
public static void main (String[] args) {
Hilo2 uno, dos;
uno = new Hilo2("Jamaica");
dos = new Hilo2("Fiji");
System.out.println("main no hace nada");
}
}
Crea y Ianza Ios 2 hiIos
Lenguajes de Programacin - Progr. Concurrente
19
Revisin EjempIo: Ejecucin
main no hace nada
0 Jamaica
0 Fiji
1 Fiji
1 Jamaica
2 Fiji
3 Fiji
2 Jamaica
3 Jamaica
4 Fiji
4 Jamaica
5 Jamaica
6 Jamaica
7 Jamaica
5 Fiji
6 Fiji
8 Jamaica
9 Jamaica
7 Fiji
FIN! Jamaica
8 Fiji
9 Fiji
FIN! Fiji
public class Demo2 {
public static void main (String[] args) {
Hilo2 uno, dos;
uno = new Hilo2("Jamaica");
dos = new Hilo2("Fiji");
System.out.println("main no hace nada");
}
}
Lenguajes de Programacin - Progr. Concurrente
20
Sincronizacin de hiIos en Java
Se trata bsicamente de una sincronizacin basada
en eI concepto de monitor, aunque no existe ese tipo
de datos como predefinido.