Publicado el 27 de Febrero del 2017
1.250 visualizaciones desde el 27 de Febrero del 2017
398,3 KB
54 paginas
Creado hace 19a (21/03/2006)
Programación Concurrente en Java
Hebras y monitores
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y Programación
Universidad Complutense de Madrid
21 de marzo de 2006
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Threads
Extendiendo la clase java.lang.Thread.
public class P r T h r e a d e x t e n d s Thread {
public P r T h r e a d ( String s ) {
super ( s );
}
public final void run () {
b o o l e a n sigue = true ;
for ( int i =0; i <100 && sigue ; i ++) {
try {
System . out . p r i n t l n ( g e t N a m e ()+ " : " + i );
sleep (20);
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . p r i n t l n ( g e t N a m e ()+ " i n t e r r u m p i d a " );
sigue = false ;
}
}
}
public static final void main ( final String [] args ){
Thread p = new P r T h r e a d ( " mia " );
p . start ();
}
}
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Threads
Implementado el interfaz java.lang.Runnable.
public class P r R u n n a b l e i m p l e m e n t s R u n n a b l e {
public final void run () {
Thread hebra = Thread . c u r r e n t T h r e a d ();
b o o l e a n sigue = true ;
for ( int i =0; i <100 && sigue ; i ++) {
try {
System . out . p r i n t l n ( hebra . g e t N a m e ()+ " : " + i );
hebra . sleep (20);
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {
System . out . p r i n t l n ( hebra . g e t N a m e ()+ " i n t e r r u m p i d a " );
sigue = false ;
}
}
}
public static final void main ( final String [] args ) {
Thread p = new Thread ( new P r R u n n a b l e () , " mia " );
p . start ();
}
}
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Ciclo de vida de una hebra
Tras crear una hebra y se ejecuta el método start, la hebra puede
estár:
1 En ejecución.
2 Suspendida: ha ejecutado sleep, join, wait.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Parar una hebra
Usar el método interrupt
public static void ex1 () throws I n t e r r u p t e d E x c e p t i o n {
Thread h = new P r T h r e a d ( " 1 " );
h . start ();
Thread . sleep (100);
h . i n t e r r u p t ();
System . out . p r i n t l n ( h . i s I n t e r r u p t e d ());
}
1
2
3
4
5
6
7
Métodos Deprecated: stop, suspend, resume.
Una hebra para cunado está Not Runnnable, ha ejecutado sleep,
join, wait.
Pueden lanzar InterruptedException, la hebra decide si para o
sigue.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
public static void ex2 () throws I n t e r r u p t e d E x c e p t i o n {
Thread h1 = new P r T h r e a d ( " 1 " );
Thread h2 = new P r T h r e a d ( " 2 " );
Thread h3 = new P r T h r e a d ( " 3 " );
h1 . start ();
h2 . start ();
h3 . start ();
h1 . join ();
h2 . join ();
h3 . join ();
}
1
2
3
4
5
6
7
8
9
10
11
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
h1.join()
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
1 h1.start(): h1 se ejecuta.
Método: join
h1.start()
h2.start()
h3.start()
h1.join()
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
h1.join()
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
h1.join()
h2.join()
h3.join()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
4 h1.join(): esperamos a que h1
h1.join()
pare.
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
4 h1.join(): esperamos a que h1
h1.join()
pare.
5 h2.join(): esperamos a que h2
pare.
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
3 h3.start(): h3 se ejecuta.
4 h1.join(): esperamos a que h1
h1.join()
pare.
5 h2.join(): esperamos a que h2
pare.
h2.join()
h3.join()
6 h3.join(): esperamos a que h3
pare (no hace falta).
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Cerrojos de objetos
Cada objeto en Java tiene un cerrojo
s y n c h r o n i z e d ( obj ) {
*/
/*
}
El cerrojo puede abarcar a todo un método
type method (...) {
s y n c h r o n i z e d ( this ) {
/*
*/
}
s y n c h r o n i z e d type method (...) {
/*
*/
}
1
2
3
1
2
3
4
1
2
3
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized?
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
¿Qué falta para tener un monitor?
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
¿Qué falta para tener un monitor? las variables condición.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
¿Qué falta para tener un monitor? las variables condición.
Todos los objetos tienen los métodos wait(), notify() y
notifyAll().
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
¿Qué falta para tener un monitor? las variables condición.
Todos los objetos tienen los métodos wait(), notify() y
notifyAll().
Un objeto con todos los métodos synchronized es un
monitor con una sola variable condición.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
¿Qué falta para tener un monitor? las variables condición.
Todos los objetos tienen los métodos wait(), notify() y
notifyAll().
Un objeto con todos los métodos synchronized es un
monitor con una sola variable condición.
¿Qué hacemos si hay varias variables condición?
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Variables condición
¿Qué ocurre si todos los métodos son synchronized? sólo se
puede ejecutar un método a la vez
¿Qué falta para tener un monitor? las variables condición.
Todos los objetos tienen los métodos wait(), notify() y
notifyAll().
Un objeto con todos los métodos synchronized es un
monitor con una sola variable condición.
¿Qué hacemos si hay varias variables condición? Todo monitor
se puede hacer con una única variable condición, con pérdida
de eficiencia: método notifyAll().
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Programación Concurrente en Java
Monitor puente
Tiene dos variables condición: norte y sur.
p r o c e d u r e p e r m i s o ( s e n t i d o s ) {
if ( s .
Comentarios de: Programación Concurrente en Java - Hebras y monitores (0)
No hay comentarios