Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 debería parar.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Esperamos a que una hebra acabe
Método: join
h1.start()
h2.start()
h3.start()
1 h1.start(): h1 se ejecuta.
h1.join()
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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.
h1.join()
h2.join()
h3.join()
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Cerrojos de objetos
Cada objeto en Java tiene un cerrojo
s y n c h r o n i z e d ( obj ) {
*/
/*
}
Sólo pueda haber una hebra propietaria del cerrojo.
Sólo una hebra propietaria del cerrojo puede ejecutar un código
synchronized.
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Durmiéndose/depertándose en un objeto
wait() Una hebra que tiene el cerrojo de un objeto puede
invocar el método wait() del objeto.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Durmiéndose/depertándose en un objeto
wait() Una hebra que tiene el cerrojo de un objeto puede
invocar el método wait() del objeto.
La hebra queda suspendida hasta que alguien la
despierte.
Se libera para que otra hebra pueda adquirirlo.
Cuando es liberarla debe adquirir de nuevo el
cerrojo para seguir la ejecución.
wait(tiempo) Igual, pero se queda dormida un tiempo máximo.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Durmiéndose/depertándose en un objeto
wait() Una hebra que tiene el cerrojo de un objeto puede
invocar el método wait() del objeto.
La hebra queda suspendida hasta que alguien la
despierte.
Se libera para que otra hebra pueda adquirirlo.
Cuando es liberarla debe adquirir de nuevo el
cerrojo para seguir la ejecución.
wait(tiempo) Igual, pero se queda dormida un tiempo máximo.
notify() Una hebra que tiene el cerrojo de un objeto puede
invocar el método notify() del objeto.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Durmiéndose/depertándose en un objeto
wait() Una hebra que tiene el cerrojo de un objeto puede
invocar el método wait() del objeto.
La hebra queda suspendida hasta que alguien la
despierte.
Se libera para que otra hebra pueda adquirirlo.
Cuando es liberarla debe adquirir de nuevo el
cerrojo para seguir la ejecución.
wait(tiempo) Igual, pero se queda dormida un tiempo máximo.
notify() Una hebra que tiene el cerrojo de un objeto puede
invocar el método notify() del objeto.
Despierta una hebra suspendida en el objeto.
No libera el cerrojo del objeto.
notifyAll Igual, pero despierta a todas.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de
Links de descarga
http://lwp-l.com/pdf2469
Comentarios de: Programación Concurrente en Java: Threads (0)
Comentarios de: Programación Concurrente en Java: Threads (0)
No hay comentarios