Implementação da programação java concorrente Cache limitado
1. Classe base de cache limitado
pacote cn.xf.cp.ch14;/** * função: cache limitado implementa a classe base * Tempo: 14:20:00 * arquivo: baseboudboudbuffer.java * @administrador de autor * * @param <V> */public class BaseBoudBuffer <V> {private final v [] buf; Tail privado int; private int head; Parte INT privada; public BaseBoudEdBuffer (INT Capacidade) {// Inicialize a matriz this.buf = (v []) novo objeto [Capacidade]; } // Coloque um dado, o método final não pode ser reescrito protegido sincronizado Final Void Doput (V V) {BUF [Tail] = V; if (++ cauda == buf.length) {cauda = 0; } // Insira um método, quantidade total ++ ++ contagem; } / *** Retire um dado* @return* / protegido sincronizado final v dotake () {v v = buf [head]; BUF [cabeça] = nulo; if (++ head == buf.length) {head = 0; } --contar; retornar v; } // Ao julgar a contagem, determine se a matriz é completa sincronizada final boolean isfull () {return count == buf.length; } public sincronizado final boolean isEmpty () {retorna contagem == 0; }}2. Determine os pré -requisitos antes de executar a operação
pacote cn.xf.cp.ch14;/*** função: verifique a inserção e obtenha as operações do elemento primeiro e depois execute a operação. A verificação não passa e não terá permissão para operar * HORA: 14:33:41 PM * Arquivo: GrumpyboudBuffer.java * @Autor Administrator * * @param <V> */classe pública GrumpyboundBuffer (int> estende a baseBundedBuffer <V> {Public GrumpyBoundBer (int size) { } public sincronizado void put (v v) lança exceção {// Se for uma fila completa, o novo elemento não poderá ser inserido se (this.isfull ()) {lança nova exceção ("qule exceder"); } this.doput (v); } // Da mesma forma, se a fila estiver vazia, o novo elemento não poderá ser recuperado public sincronizado v Take () lança a exceção {if (this.isEmpty ()) {lança nova exceção ("nenhum elemento na fila"); } return this.Dotake (); }}3. Alcançar um simples bloqueio através da pesquisa e do sono
pacote cn.xf.cp.ch14;/** *função: implemente bloqueio simples por meio de pesquisa e hibernação *Tempo: 14:55:54 pm *Arquivo: sleepyboudbuffer.java * @administrador de autor * *@param <v> */public classe sleepyboudbuffer <V> estende a baseBoudBer <V>: public sleepyboundedbuffer (intaconity) {super (capacidade); } // Ao colocar a fila public void put (v v) lança interruptedException {while (true) {// O loop não está bloqueado aqui, caso contrário, o bloqueio não será lançado. Se a hibernação não estiver bloqueada, o sono está trancado e outros não podem operá -lo durante a hibernação. É impossível para um elemento sair sincronizado (this) {// Se a fila não estiver cheia, coloque o elemento se (! This.isfull ()) {this.doput (v); retornar; }} // Caso contrário, durma e saia da CPU para ocupar thread.sleep (sleep_granularity); }} public V Take () lança interruptedException {while (true) {// O loop não está bloqueado aqui, caso contrário, o bloqueio não será lançado. Se o sono não estiver trancado, o sono está trancado e outros não podem operá -lo quando dormem. Nunca haverá novos elementos entrando em sincronizado (this) {// Se a parte da matriz estiver vazia, os dados poderão ser recuperados se (! This.isempty ()) {return this.Dotake (); } // Se a fila estiver vazia, tente dormir por alguns segundos novamente} thread.sleep (sleep_granularity); }}}4. Fila condicional
pacote cn.xf.cp.ch14;/** * função: use a fila da condição * tempo: 15:32:04 * arquivo: limite de limite.java * @administrador de autor * * @param <V> */public class LoudedBuffer <V> estende a base de base <V> {Public Limbuffer (Int Capacidade). } /** * Coloque elementos de dados * @param v * @Throws InterruptEdException * /public sincronizado void put (v v) lança interruptedException {while (this.isfull ()) {// suspender o programa aqui e o bloqueio será lançado this.wait (); } // Se a fila não estiver cheia, o programa será despertado e o bloqueio será recuperado. // A execução termina e acorda outras filas this.NotifyAll (); } public sincronizada v Take () lança interruptedException {while (this.isEmpty ()) {this.wait (); } V v = this.Dotake (); this.NotifyAll (); retornar v; }}Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!