Java: ejemplo de consumidor de productor: manejo de lectura/escritura simultánea
Publicado: 2019-02-17 El producer-consumer problem
(también conocido como el bounded-buffer problem
) es un ejemplo clásico de Java de un problema de sincronización de procesos múltiples.
El problema describe dos procesos, the producer
y the consumer
, que comparten un búfer común de tamaño fijo que se utiliza como cola. El trabajo del productor es generar un dato, ponerlo en el búfer y comenzar de nuevo.
Al mismo tiempo, el consumidor consume los datos (es decir, los elimina del búfer) de uno en uno. El problema es asegurarse de que el productor no intente agregar datos en el búfer si está lleno y que el consumidor no intente eliminar datos de un búfer vacío.
A continuación, el programa Java simple creará este problema:
Ejemplos de Java: problema del consumidor del productor
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package com . crunchify . tutorials ; import java . util . Vector ; import java . util . Iterator ; /** * @author Crunchify */ public class CrunchifyProducerConsumer { private static Vector <Object> data = new Vector <Object> ( ) ; public static void main ( String [ ] args ) { new Producer ( ) . start ( ) ; new Consumer ( ) . start ( ) ; } public static class Consumer extends Thread { Consumer ( ) { super ( "Consumer" ) ; } @Override public void run ( ) { for ( ; ; ) { try { Thread . sleep ( 1 ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } @SuppressWarnings ( "rawtypes" ) Iterator it = data . iterator ( ) ; while ( it . hasNext ( ) ) it . next ( ) ; } } } public static class Producer extends Thread { Producer ( ) { super ( "Producer" ) ; } @Override public void run ( ) { for ( ; ; ) { try { Thread . sleep ( 1 ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } data . add ( new Object ( ) ) ; if ( data . size ( ) > 1000 ) data . remove ( data . size ( ) - 1 ) ; } } } } |
Asunto:
1 2 3 4 |
Exception in thread "Consumer" java . util . ConcurrentModificationException at java . util . ArrayList $ Itr . checkForComodification ( ArrayList . java : 819 ) at java . util . ArrayList $ Itr . next ( ArrayList . java : 791 ) at com . crunchify . tutorials . CrunchifyProducerConsumer $ Consumer . run ( CrunchifyProducerConsumer . java : 36 ) |

Resolución:
Agregue la palabra clave synchronized
para bloquear los data
mientras los usamos.
Mejor programa Java:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package crunchify . com . tutorials ; import java . util . Iterator ; import java . util . Vector ; /** * @author Crunchify.com * Producer Consumer Example in Java */ public class CrunchifyProducerConsumer { private static Vector <Object> data = new Vector <Object> ( ) ; public static void main ( String [ ] args ) { new Producer ( ) . start ( ) ; new Consumer ( ) . start ( ) ; } public static class Consumer extends Thread { Consumer ( ) { super ( "Consumer" ) ; } @SuppressWarnings ( "rawtypes" ) @Override public void run ( ) { for ( ; ; ) { try { Thread . sleep ( 1000 ) ; System . out . println ( "Object Consumed ################" ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } synchronized ( data ) { Iterator it = data . iterator ( ) ; while ( it . hasNext ( ) ) it . next ( ) ; } } } } public static class Producer extends Thread { Producer ( ) { super ( "Producer" ) ; } @Override public void run ( ) { for ( ; ; ) { try { Thread . sleep ( 1000 ) ; System . out . println ( "Object Produced ~~~~~~~~~~~~~~~" ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } data . add ( new Object ( ) ) ; if ( data . size ( ) > 1000 ) data . remove ( data . size ( ) - 1 ) ; } } } } |