Sistemas operativos modernos

public class ProductorConsumidor { static final int N = 100; // constante que da el tamaño del búfer static productor p = new productor{ ); // crea un nuevo subproceso productor static consumidor c = new consumidor! ); // crea un nuevo subproceso consumidor static mi_monitor mon = new mi_monitor( ); // crea un nuevo monitor public static void main(String args( ]) { p.start( ): // inicia subproceso productor c.start( ): // inicia subproceso consumidor } static class productor extends Thread { public void run( ) {// el método run contiene el código del subproceso int elem; while (true) { // ciclo del productor elem = producir_elem( ); mon.insertar(elem): } } private int producir_elem( ) { . . . } // aquí se produce } static class consumidor extends Thread { public void run( ) { el método run contiene el código del subproceso Int elem; while (true) { // ciclo del consumidor elem = mon.quitar( ); consumir_elem(elem); } } private void consumir_elem(int elem) { . . . } // aquí se consume } static class mi_monitor { // éste es un monitor private int buffer[ ] = new int[N]; private int cuenta = 0, baja = O, alta = 0; // contadores e índices public synchronized void insertar(int val) { if (cuenta == N) desactivarse! ): H si el búfer está lleno, se desactiva buffer[alta] = val; // inserta un elemento en el búfer alta = (alta + 1) % N; // ranura para poner siguiente elemento cuenta = cuenta + 1; // hay un elemento más en el búfer if (cuenta == 1) notify( ); // si el consumidor estaba inactivo, lo activa } public synchronized int quitar( ) { int val; if (cuenta == 0) desactivarse! ); // si el búfer está vacío, se desactiva val = buffer(baja]; // saca un elemento del búfer baja = (baja + 1) % N; // ranura de donde tomar siguiente elemento cuenta = cuenta - 1; //un elemento menos en el búfer if (cuenta == N - 1 ) notify( ); // si el productor estaba inactivo, lo activa return val; } private void desactivarse! ) { try{wait( );} catch(lnterruptedException exc) {};} Figura 2-28. Una solución del problema del productor-consumidor en Java.

RkJQdWJsaXNoZXIy MjI4NDcx