Publicado el 26 de Febrero del 2017
2.101 visualizaciones desde el 26 de Febrero del 2017
479,2 KB
39 paginas
Creado hace 16a (24/04/2008)
Programación Concurrente en Java: Threads
Luis Fernando Llana Díaz
Departamento de Sistemas Informáticos y Computación
Universidad Complutense de Madrid
24 de abril de 2008
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
h2
h3
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 extends Thread {
public P r T h r e a d ( String s ) {
super ( s );
}
public final void run () {
boolean sigue = true ;
for ( int i =0; i <100 && sigue ; i ++) {
try {
System . out . println ( getName ()+ " : " + 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 . println ( getName ()+ " 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 ();
boolean sigue = true ;
for ( int i =0; i <100 && sigue ; i ++) {
try {
System . out . println ( hebra . getName ()+ " : " + 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 . println ( hebra . getName ()+ " 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
Nueva hebra
Se crea la hebra.
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
running
yield
Nueva hebra
Runnable
Se crea la hebra.
La hebra está en ejecución. Se ejecuta el método start.
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
running
yield
Nueva hebra
Runnable
Not runnable
Se crea la hebra.
La hebra está en ejecución. Se ejecuta el método start.
La hebra se suspende: 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
Ciclo de vida de una hebra
running
yield
Nueva hebra
Runnable
Not runnable
El metodo run finaliza
Dead
Se crea la hebra.
La hebra está en ejecución. Se ejecuta el método start.
La hebra se suspende: ha ejecutado sleep, join, wait.
La hebra finaliza. El método run finaliza.
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 . println ( 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
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
1 h1.start(): h1 se ejecuta.
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
h2
1 h1.start(): h1 se ejecuta.
2 h2.start(): h2 se ejecuta.
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
h2
h3
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 ComputaciónUniversidad Complutense de Madrid
Programación Concurrente en Java: Threads
Esperamos a que una hebra acabe
Método: join
h1
h2
h3
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 pare.
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
h2
h3
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 pare.
5 h2.join(): esperamos a
que h2 pare.
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
h2
h3
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 pare.
5 h2.join(): esperamos a
que h2 pare.
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 d
Comentarios de: Programación Concurrente en Java: Threads (0)
No hay comentarios