Implementación de Java Programación concurrente Cache limitado
1. Clase base de caché acotado
paquete cn.xf.cp.ch14;/** * Función: Cache limitado implementa la clase base * Tiempo: 2:20:00 PM * Archivo: BaseBoundedBuffer.java * @Author Administrator * * @param <v> */public class BaseBoundedBuffer <v> {private final v [] buf; Tail privada int; Private int Head; privado int count; public BaseBoundedBuffer (int capacidad) {// Inicializar la matriz this.buf = (v []) nuevo objeto [capacidad]; } // Poner datos, el método final no puede reescribirse protegido sincronizado Final Void Doput (V V) {buf [tail] = v; if (++ tail == buf.length) {tail = 0; } // insertar un método, cantidad total ++ ++ recuento; } / *** Saque los datos* @return* / protegido sincronizado V dotake () {v v = buf [head]; buf [cabeza] = nulo; if (++ head == buf.length) {head = 0; } --contar; regreso v; } // Al juzgar el recuento, determine si la matriz es un booleano final sincronizado completo completo isfull () {return count == buf.length; } public sincronizado Final Boolean isEtimty () {return count == 0; }}2. Determine los requisitos previos antes de realizar la operación
Paquete cn.xf.cp.ch14;/*** Función: verifique primero la inserción y obtenga las operaciones de elementos y luego realice la operación. La verificación no pasa y no se le permitirá operar * Tiempo: 2:33:41 PM * Archivo: GrumpyBoundedBuffer.java * @Author Administrator * * @param <v> */public class GrumpyBoundedBuffer <V> extiende BaseBoundedBuffer <V> {public GrumpyBoundedBuffer (intento) {Super (tamaño); } public sincronizado void put (v v) lanza la excepción {// Si es una cola completa, el nuevo elemento no se puede insertar si (this.isfull ()) {Throw New Exception ("Qule excede"); } this.doput (v); } // Del mismo modo, si la cola está vacía, el nuevo elemento no se puede recuperar públicamente sincronizado v Take () lanza la excepción {if (this.isEmpty ()) {tirar nueva excepción ("Sin elemento en la cola"); } return this.dotake (); }}3. Lograr un bloqueo simple a través de la encuesta y el sueño
paquete cn.xf.cp.ch14;/** *función: implementar un bloqueo simple a través de la encuesta y la hibernación *Tiempo: 2:55:54 pm *Archivo: SleepyBoundedBuffer.java * @Author Administrator * *@param <v> */Clase public SleepyBoundedBuffer <v> Extiende BaseBoundedBuffer <V> {/// 2 static static staty 2000; public sleepyBoundedBuffer (int capacidad) {super (capacidad); } // Al poner la cola public void put (v v) lanza interruptedException {while (true) {// El bucle no está bloqueado aquí, de lo contrario el bloqueo no se lanzará. Si la hibernación no está bloqueada, el sueño está bloqueado y otros no pueden operarlo durante la hibernación. Es imposible que un elemento salga sincronizado (this) {// Si la cola no está llena, luego coloque el elemento if (! This.isfull ()) {this.doput (v); devolver; }} // de lo contrario, duerma y salga de la CPU para ocupar hilo.sleep (sleep_granularity); }} public v Take () lanza interruptedException {while (true) {// El bucle no está bloqueado aquí, de lo contrario el bloqueo no se lanzará. Si el sueño no está bloqueado, el sueño está bloqueado y otros no pueden operarlo cuando duermen. Nunca habrá nuevos elementos sincronizados (this) {// Si la parte de la matriz está vacía, entonces los datos se pueden recuperar si (! This.isEmpty ()) {return this.dotake (); } // Si la cola está vacía, intente dormir durante unos segundos nuevamente} thread.sleep (sleep_granularity); }}}4. Cola condicional
paquete cn.xf.cp.ch14;/** * Función: Usar cola de condición * Tiempo: 3:32:04 PM * Archivo: BoundedBuffer.java * @Author Administrator * * @param <v> */public class BoundedBuffer <V> Extiende baseBoundedBuffer <v> {public BoundedBuffer (int capacidad) {Super (Capacidad); } /** * Pon elementos de datos * @param v * @throws interrumpedException * /public sincronizado void put (v v) lanza interruptedException {while (this.isfull ()) {// suspender el programa aquí y el bloqueo se lanzará esto.wait (); } // Si la cola no está llena, entonces el programa se despierta y el bloqueo se recuperará esto.doput (v); // La ejecución termina y despierta otras colas this.notifyall (); } public sincronizado v Take () lanza interruptedException {while (this.isEmpty ()) {this.wait (); } V V = this.dotake (); this.notifyall (); regreso v; }}Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!