con tenedor
TRANSCRIPT
-
7/25/2019 Con Tenedor
1/5
[Java] Monitores, ejemplo Productor ConsumidorPublicado: 25 noviembre, 2014 enJavaEtiquetas:concurrencia,concurrency,Fumadores,Java,monitores,notifAll,notiy,Productorconsumidor,synchronized,wait
1
La concurrencia es algo que suele costar ver pero que en realidad no es tan complicada, en Java
podemos utilizar los monitores las !ebras para realizar tareas concurrentes"
Qu es un monitor?
Los monitores son ob#etos destinados a ser usados sin peligro por m$s de un !ilo de
e#ecuci%n" &as in'ormaci%n"
Qu mtodos nos proveen los monitores para la implementacin de tareas
concurrentes?
synchronized
(l poner la palabra reservada snc!ronized en un m)todo en Java estamos indicando que en ese
m)todo tenemos una secci%n cr*tica del c%digo por lo tanto las !ebras que accedan a dic!o
m)todo deber$n !acerlo de 'orma s*ncrona"
wait()
+on ait bloqueamos una !ebra"
notify()
+on noti' desbloqueamos una de las !ebras que !an sido bloqueadas al intentar acceder a un
m)todo sincronizado" -espu)s de esta llamada la !ebra desbloqueada podr$ tener acceso sin
peligro a la zona cr*tica del m)todo sincronizado"
notifyAll()
https://programaressencillo.wordpress.com/category/java/https://programaressencillo.wordpress.com/category/java/https://programaressencillo.wordpress.com/tag/concurrencia/https://programaressencillo.wordpress.com/tag/concurrency/https://programaressencillo.wordpress.com/tag/concurrency/https://programaressencillo.wordpress.com/tag/fumadores/https://programaressencillo.wordpress.com/tag/fumadores/https://programaressencillo.wordpress.com/tag/fumadores/https://programaressencillo.wordpress.com/tag/java/https://programaressencillo.wordpress.com/tag/monitores/https://programaressencillo.wordpress.com/tag/monitores/https://programaressencillo.wordpress.com/tag/notifiall/https://programaressencillo.wordpress.com/tag/notifiall/https://programaressencillo.wordpress.com/tag/notify/https://programaressencillo.wordpress.com/tag/notify/https://programaressencillo.wordpress.com/tag/notify/https://programaressencillo.wordpress.com/tag/productor-consumidor/https://programaressencillo.wordpress.com/tag/productor-consumidor/https://programaressencillo.wordpress.com/tag/synchronized/https://programaressencillo.wordpress.com/tag/synchronized/https://programaressencillo.wordpress.com/tag/wait/https://programaressencillo.wordpress.com/tag/wait/https://programaressencillo.wordpress.com/2014/11/25/java-monitores-ejemplo-productor-consumidor/#commentshttp://es.wikipedia.org/wiki/Monitor_(concurrencia)https://programaressencillo.wordpress.com/tag/concurrencia/https://programaressencillo.wordpress.com/tag/concurrency/https://programaressencillo.wordpress.com/tag/fumadores/https://programaressencillo.wordpress.com/tag/java/https://programaressencillo.wordpress.com/tag/monitores/https://programaressencillo.wordpress.com/tag/notifiall/https://programaressencillo.wordpress.com/tag/notify/https://programaressencillo.wordpress.com/tag/productor-consumidor/https://programaressencillo.wordpress.com/tag/productor-consumidor/https://programaressencillo.wordpress.com/tag/synchronized/https://programaressencillo.wordpress.com/tag/wait/https://programaressencillo.wordpress.com/2014/11/25/java-monitores-ejemplo-productor-consumidor/#commentshttp://es.wikipedia.org/wiki/Monitor_(concurrencia)https://programaressencillo.wordpress.com/category/java/ -
7/25/2019 Con Tenedor
2/5
La di'erencia entre noti' noti'(ll es que con este .ltimo desbloqueamos todas las !ebras que
'ueron bloqueadas en un m)todo s*ncrono estas competir$n por acceder a la zona cr*tica" Las
!ebras que no consigan acceder volver$n a ser bloqueadas"
/abiendo todo esto podemos crear aplicaciones concurrentes mediante el uso de monitores,
vamos a poner el e#emplo del productor consumidor de buer limitado"
Tenemos un productor que va produciendo nmeros de uno en uno y una serie de consumidores
que irn consumiendo dichos nmeros. El productor no podr producir mas de un nmero y los
consumidores no podrn consumir nada si no se ha producido antes.
Primeramente nos crearemos la clase Contenedor, que ser$ donde el productor producir$ los
n.meros de donde los consumidores los consumir$n:
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
27
28
publicclassContenedor
{
privateintcontenido;
privatebooleancontenedorlleno = Boolean.FALSE;
/**
* Obtiene de fora concurrente o s!ncrona el eleento "ue #a$ en el
contenedor
* %return Contenido el contenedor
*/
publics$nc#roni&edint'et()
{
#ile(+contenedorlleno)
{
tr$
{
ait();
,
catc#(-nterruptedEception e)
{
S$ste.err.println(Contenedor0 Error en 'et 12 3
e.'et4essa'e());
,
,
contenedorlleno = Boolean.FALSE; notif$();
returncontenido;
,
/**
* -ntroduce de fora concurrente o s!ncrona un eleento en el
contenedor
* %para value Eleento a introducir en el contenedor
*/
-
7/25/2019 Con Tenedor
3/5
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
publics$nc#roni&edvoidput(intvalue)
{
#ile(contenedorlleno)
{
tr$
{
ait();
,
catc#(-nterruptedEception e)
{
S$ste.err.println(Contenedor0 Error en put 12 3
e.'et4essa'e());
,
,
contenido = value;
contenedorlleno = Boolean.567E;
notif$();
,,
os creamos la clase roductor:
1
2
3
4
5
67
8
9
10
11
12
13
14
15
16
1718
19
20
21
22
23
24
publicclass8roductor ipleents6unnable
{
privatefinal6ando aleatorio;
privatefinalContenedor contenedor;
privatefinalintidproductor;
privatefinalint5-E48OES8E6A = 9:;
/**
* Constructor de la clase
* %para contenedor Contenedor con de la #ebra
*/
publicvoidrun()
{
#ile(Boolean.567E)
{
intponer = aleatorio.net-nt(?);
contenedor.put(poner);
-
7/25/2019 Con Tenedor
4/5
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
S$ste.out.println(El productor 3 idproductor 3 pone0 3 pon
tr$
{
5#read.sleep(5-E48OES8E6A); ,
catc#(-nterruptedEception e)
{
S$ste.err.println(8roductor 3 idproductor 3 0 Error en ru
e.'et4essa'e());
,
,
,
,
os creamos la clase Consumidor:
1
2
3
4
5
6
7
8
9
1011
12
13
14
15
16
17
18
19
20
2122
23
24
25
26
27
28
publicclassConsuidor ipleents6unnable
{
privatefinalContenedor contenedor;
privatefinalintidconsuidor;
/**
* Constructor de la clase
* %para contenedor Contenedor con de la #ebra
*/
publicvoidrun()
{
#ile(Boolean.567E) {
S$ste.out.println(El consuidor 3 idconsuidor 3 consue0
contenedor.'et());
,
,
,
-
7/25/2019 Con Tenedor
5/5
por .ltimo el c%digo principal, clase llamada roductorConsumidorpor e#emplo, quedar*a de la
siguiente 'orma:
1
2
34
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
publicclass8roductorConsuidor
{
privatestaticContenedor contenedor;
privatestatic5#read productor;
privatestatic5#read @ consuidores;
privatestaticfinalintCA5-ACOS74-O6ES = :;
/**
* %para ar's t#e coand line ar'uents
*/
publicstaticvoidain(Strin'@ ar's)
{
contenedor = neContenedor();
productor = ne5#read(ne8roductor(contenedor 9));
consuidores = ne5#read@CA5-ACOS74-O6ES;
for(inti = ; i D CA5-ACOS74-O6ES; i33)
{
consuidores@i = ne5#read(neConsuidor(contenedor i));
,
productor.start();
,
,
3s de#o el c%digo del productor consumidor en Java:Java6Productor6+onsumidor
7ambi)n os de#o el c%digo del problema de los 'umadores en Java realizado con
monitores: Java6Problema68umadores
https://github.com/galleta/-Java-_Productor_Consumidorhttps://github.com/galleta/-Java-_Productor_Consumidorhttps://github.com/galleta/-Java-_Problema_Fumadoreshttps://github.com/galleta/-Java-_Productor_Consumidorhttps://github.com/galleta/-Java-_Problema_Fumadores