Publicado el 26 de Febrero del 2017
1.352 visualizaciones desde el 26 de Febrero del 2017
307,6 KB
35 paginas
Creado hace 17a (07/05/2007)
Programación Concurrente en Java: Threads
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y Computación
Universidad Complutense de Madrid
7 de mayo de 2007
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Ejemplos de programación concurrente
En un sistema operativo, diversos programas compiten por los
recursos del sistema: memoria, dispositivos.
Bases de datos.
Aplicaciones Web.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Hebras, hilos
En un programa concurrente puede haber varios hilos de
computación.
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
Sincronización de Objetos
Puede haber varias hebras ejecutando simultáneamente
métodos de objetos
Es necesario sincronizar los accesos al objeto.
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
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 ();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Luis Fernando Llana Díaz
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
Comentarios de: Programación Concurrente en Java: Threads (0)
No hay comentarios