Académique Documents
Professionnel Documents
Culture Documents
Un thread
Un programa
09-03-2007
Qu es un thread? (cont.)
Ejemplo
for(int i = 1; i<100;i++)
for(int i = 1; i<100;i++)
System.out.printl(Hola + i );
System.out.printl(Chao + i );
Dos threads
Franco Guidi Polanco
09-03-2007
09-03-2007
Ejemplo (cont.)
Output posible:
Hola
Hola
Chao
Hola
Chao
Chao
Hola
1
2
1
3
2
3
4
09-03-2007
09-03-2007
09-03-2007
09-03-2007
09-03-2007
c.start();
System.out.println( Fin programa );
Thread
Chao
c.start();
Thread
Hola
...
}
...
Estos dos
programas
funcionan
de igual
modo
09-03-2007
10
11
NOTA:
Ejecucin en JVM
sobre Windows XP.
El resultado puede ser
distinto en otras
plataformas
(se estudiar ms
adelante)
09-03-2007
h.start();
...
h.start();
Thread
main
09-03-2007
12
09-03-2007
13
09-03-2007
15
09-03-2007
14
09-03-2007
16
Ejercicio
09-03-2007
17
Solucin
09-03-2007
Solucin (cont.)
09-03-2007
18
19
09-03-2007
20
Ejemplo:
Equivalente:
public class MyThread extends Thread {
...
public void run() {
...
try{
sleep( 1000 );
}catch(InterruptedException e){
//Interrupcin
}
...
}
}
Franco Guidi Polanco
09-03-2007
Thread.sleep( 1000 );
NOTA: Si en vez de
extender Thread se
hubiese implementado
Runnable, entonces aqu
hubiese sido necesaria la
referencia a la clase
Thread para invocar el
mtodo sleep().
21
Detencin de 1000 ms
(1 segundo)
Tiempo de detencin
al azar
09-03-2007
22
Ejemplo:
Equivalente:
public class MyThread extends Thread {
...
public void run() {
...
yield();
...
}
}
09-03-2007
23
09-03-2007
Thread.yield();
NOTA: Si en vez de
extender Thread se
hubiese implementado
Runnable, entonces aqu
hubiese sido necesaria la
referencia a la clase
Thread para invocar el
mtodo yield().
24
09-03-2007
25
Ejecutndose
(Running)
yield
Nuevo thread
(New Thread)
start
Ejecutable
(Runnable)
09-03-2007
26
sleep
wait
bloqueado en I/O
No ejecutable
(Not Runnable)
09-03-2007
Tomado de
The Java Tutorial
Sun Microsystems
27
09-03-2007
28
09-03-2007
29
Ejecucin de threads
En un sistema con mltiples CPU, cada CPU podra
ejecutar un thread distinto
Concurrencia
Si no es posible el paralelismo, una CPU es responsable
de ejecutar mltiples threads
Thread A
Thread B
Thread A
Thread A
Thread B
Thread B
Thread A
Thread B
Thread A
...
...
...
CPU
CPU
CPU
09-03-2007
30
Paralelismo
09-03-2007
31
09-03-2007
32
10
1
5
09-03-2007
33
09-03-2007
34
09-03-2007
35
09-03-2007
36
Threads egostas
09-03-2007
37
09-03-2007
09-03-2007
38
39
09-03-2007
40
Thread Hola
mensaje[pos]=msg;
pos++;
mensaje[pos]=msg;
pos++;
41
Thread Chao
mensaje[0]=Hola
mensaje[pos]=msg;
pos++;
pos++;
pos = 2
mensaje[pos]=msg;
pos++;
mensaje[2]=Hola
pos = 3
mensaje[pos]=msg;
pos++;
mensaje[3]=Chao
pos = 4
09-03-2007
42
mensaje[pos]=msg;
mensaje[1]=Chao
pos = 2
mensaje[2]=Hola
pos = 3
mensaje[pos]=msg;
pos++;
09-03-2007
Thread Hola
mensaje[0]=Hola
pos = 1
mensaje[pos]=msg;
pos++;
Thread Chao
mensaje[0]=Chao
pos = 1
mensaje[pos]=msg;
mensaje[3]=Chao
pos++;
pos = 4
mensaje[3]=Hola
pos = 5
09-03-2007
43
09-03-2007
44
Objeto
Mutex
Threads
Franco Guidi Polanco
09-03-2007
45
09-03-2007
46
mutex
historial.agregar()
Thread
Chao
historial.agregar()
historial
mensaje[pos]=msg;
pos++;
09-03-2007
47
09-03-2007
48
Objeto
09-03-2007
49
09-03-2007
50
Mtodos synchronized
51
09-03-2007
52
Ejemplo de deadlock
09-03-2007
}
}
NOTA:
Ejemplo adaptado de Programming Java Threads in the real world (Parte 2),
Allan Holub, disponible on-line: http://www.javaworld.com
53
4.
54
(Clase Batman)
09-03-2007
55
09-03-2007
56
Bloques synchronized
synchronized( objeto ){
// instrucciones
}
09-03-2007
57
09-03-2007
58
59
09-03-2007
60
09-03-2007
61
Sincronizacin de threads
09-03-2007
Excluyentes
09-03-2007
62
Sincronizacin de threads
Excluyentes
63
Productor
Depsito
Consumidor
09-03-2007
64
Ejemplo de sincronizacin
Supongamos la siguiente implementacin de un
Productor y un Consumidor:
public class Productor extends Thread {
private Deposito deposito;
public Productor(Deposito d) {
deposito = d;
}
public void run() {
for (int i=1;i<20 ;i++ )
deposito.guardar();
}
}
09-03-2007
65
09-03-2007
66
Lista de espera
CPU
09-03-2007
wait
67
09-03-2007
68
09-03-2007
69
Lista
de
espera
llegu
llegu
Pedro
llegu
Inscripcin para
notificacin (wait)
Franco Guidi Polanco
09-03-2007
llegu
lleg Pedro
Pedro
Pedro
Inscripcin para
notificacin (wait)
Franco Guidi Polanco
09-03-2007
70
llegu
71
09-03-2007
72
09-03-2007
73
Mutex
Lista de
espera
depsito
Thread
Consumidor
Thread
Productor
Verifica que depsito est
vaco y agrega un elemento.
09-03-2007
74
75
Mutex
Lista
de espera
Thread
Consumidor
depsito
09-03-2007
76
2.
09-03-2007
77
09-03-2007
79
6.
09-03-2007
78
por:
while( condicin de detencin )
wait();
09-03-2007
Spin lock
80
http://java.sun.com
09-03-2007
81
09-03-2007
82