con tenedor

Upload: adrianduran

Post on 28-Feb-2018

214 views

Category:

Documents


0 download

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));

    [email protected]();

    ,

    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