PDF de programación - Programación Concurrente en Java: Threads

Imágen de pdf Programación Concurrente en Java: Threads

Programación Concurrente en Java: Threadsgráfica de visualizaciones

Publicado el 26 de Febrero del 2017
1.054 visualizaciones desde el 26 de Febrero del 2017
275,6 KB
15 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

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

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.

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 Madrid

Programación Concurrente en Java: Threads

Regiones críticas

El acceso a las regiones críticas debe ser exclusivo

public void run () {

boolean para = false ;
while (! para ) {

try {

ciclo ();

} catch ( I n t e r r u p t e d E x c e p t i o n e ) {

para = true ;

}

}

}
private void ciclo () throws I n t e r r u p t e d E x c e p t i o n {

monitor . entrar ();
I n t e r r u p t e d E x c e p t i o n salir = null ;
try {

r e g C r i t i c a ();

} catch ( I n t e r r u p t e d E x c e p t i o n e ) {

salir = e ;

} finally {

monitor . salir ();
if ( salir != null ) {
throw salir ;

}
int t = random . nextInt ( t i e m p o D e n t r o );
sleep ( t );

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

Luis Fernando Llana Díaz

Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid

Programación Concurrente en Java: Threads

Monitor regiones críticas

public class Monitor {

private int caben ; // caben >=0
public Monitor () {

caben =1;

}
public s y n c h r o n i z e d void salir () {

caben ++;
notify ();

}

public s y n c h r o n i z e d void entrar () throws I n t e r r u p t e d E x c e p t i o n {

while ( caben ==0) wait ();
caben - -;

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Luis Fernando Llana Díaz

Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid

Programación Concurrente en Java: Threads

Colecciones sincronizadas

En la clase java.util.Collections encontramos los siguientes
métodos estáticos:

public static <T > Collection <T > s y n c h r o n i z e d C o l l e c t i o n ( Collection <T > c )

public static <T > Set <T > s y n c h r o n i z e d S e t ( Set <T > s )

public static <T > SortedSet <T > s y n c h r o n i z e d S o r t e d S e t ( SortedSet <T > s )

public static <T > List <T > s y n c h r o n i z e d L i s t ( List <T > list )

public static <K ,V > Map <K ,V > s y n c h r o n i z e d M a p ( Map <K ,V > m )

public static <K ,V > SortedMap <K ,V > s y n c h r o n i z e d S o r t e d M a p ( SortedMap <K ,V > m )

1

1

1

1

1

1

Luis Fernando Llana Díaz

Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid

Programación Concurrente en Java: Threads

Lectores/Escritores I

public void run ()

{

try {

monitor . p e r m i s o L e e r ();
lee ();

} finally {

monitor . finLeer ();

}

}

public void run ()

{

try {

monitor . p e r m i s o E s c r i b i r ();
escribe ();

} finally {

monitor . f i n E s c r i b i r ();

}

}

1
2
3
4
5
6
7
8

1
2
3
4
5
6
7
8

Luis Fernando Llana Díaz

Departamento de Sistemas Informáticos y ComputaciónUniversidad Complutense de Madrid

Programación Concurrente en Java: Threads

Lectores/Escritores II

package s i m u l a c i o n . l e c t o r e s E s c r i t o r e s ;
public class Monitor {

private int e s c r E s p e r a n d o ;
private int numLect ; // núm l e c t o r e s l e y e n d o
private int numEscr ; // núm e s c r i t o r e s e s c r i b i e n d o

// núm e s c r i t o r e s e s p e r a n d o

// e s c r E s p e r a n d o >= numEscr , 0 <= numEscr <=1 numLect >=0 , nunLect >0 - - - > n u m E s c r =0

public Monitor () {

e s c r E s p e r a n d o =0; numLect =0; numEscr =0;

}
public s y n c h r o n i z e d void p e r m i s o L e e r () throws I n t e r r u p t e d E x c e p t i o n {

while ( numEscr >0 || escrEsperando >0) wait ();
numLect ++;

}
public s y n c h r o n i z e d void finLeer () {

numLect - -;
n o t i f y A l l ();

}
public s y n c h r o n i z e d void p e r m i s o E s c r i b i r () throws I n t e r r u p t e d E x c e p t i o n {

e s c r E s p e r a n d o ++;
while ( numLect >0) wa
  • Links de descarga
http://lwp-l.com/pdf2463

Comentarios de: Programación Concurrente en Java: Threads (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad