Реализация кэша с ограниченным программированием Java
1. Базовый класс ограниченного кеша
Пакет Cn.xf.cp.ch14;/** * Функция: ограниченный кэш реализует базовый класс * Время: 2:20:00 * Файл: baseboundbuffer.java * @Author Administrator * * @param <v> */public class baseboundbuffer <v> {private final v [] buf; частный int хвост; частный int Head; частный int count; public baseboundedbuffer (int емкость) {// Инициализировать массив this.buf = (v []) новый объект [емкость]; } // Поместите данные, конечный метод не может быть переписан защищенным синхронизированным конечным void Doput (v v) {buf [tail] = v; if (++ tail == buf.length) {tail = 0; } // Вставить метод, общая сумма ++ ++ count; } / *** Установите данные* @return* / Защищенный синхронизированный окончательный v Dotake () {v v = buf [head]; buf [Head] = null; if (++ head == buf.length) {head = 0; } --считать; возврат V; } //, судя по количеству, определите, является ли массив полным общедоступным синхронизированным окончательным логическим явлением () {return count == buf.length; } public Synchronized Final Boolean isempty () {return count == 0; }}2. Определите предпосылки перед выполнением операции
Пакет CN.XF.CP.CH14;/*** Функция: сначала проверьте вставку и получите операции элементов, а затем выполните операцию. Проверка не проходит и не будет разрешена работать * Время: 2:33:41 * Файл: GrumpyboundedBuffer.java * @Author Administrator * * @param <v> */public class GumpyboundedBuffer <v> расширяет baseboundbuffer <v> {public grumpyboundbuffer (int size); } public Synchronized void put (v v) бросает исключение {// Если это полная очередь, новый элемент не может быть вставлен, если (this.isfull ()) {бросить новое исключение («Qule превышает»); } this.doput (v); } // Точно так же, если очередь пуст, новый элемент не может быть получен публичным синхронизированным v table () выбрасывает исключение {if (this.isempty ()) {бросить новое исключение («Нет элемента в очередь»); } вернуть это.dotake (); }}3. достичь простой блокировки с помощью опроса и сна
Пакет cn.xf.cp.ch14;/** *Функция: реализовать простое блокирование через опрос и спячку *Время: 2:55:54. 2000; public sleepboundedbuffer (int емкость) {super (емкость); } // При вложении в очередь public void put (v v) бросает прерывание ExtruptException {while (true) {// Цикл здесь не заблокирован, в противном случае блокировка не будет выпущена. Если спячка не заблокирована, сон заблокирован, а другие не могут управлять им во время зимней спячки. Элемент не может выходить из синхронизированного (это) {// Если очередь не полна, то поместите элемент, если (! This.isfull ()) {this.doput (v); возвращаться; }} // В противном случае спите и выйдите из процессора, чтобы занять Thread.slepe (sleep_granulity); }} public v () Throws Throws urruptedException {while (true) {// Цикл здесь не заблокирован, в противном случае блокировка не будет выпущена. Если сон не заперт, сон заперт, а другие не могут управлять им во время сна. Никогда не появятся новые элементы, поступающие в синхронизированные (это) {// Если часть массива пуста, то данные можно получить, если (! This.isempty ()) {return this.dotake (); } // Если очередь пуста, попробуйте снова спать в течение нескольких секунд} Thread.sleep (sleep_granulity); }}}4. Условная очередь
Пакет CN.XF.CP.CH14;/** * Функция: использование очередей условий * Время: 3:32:04 * Файл: BoundEdedBuffer.java * @Author Administrator * * @param <v> */public class boundedbuffer <v> extends baseboundbuffer <v> {public boundedbuffer (int емкость) {super (емкость); } /** * Поместите элементы данных * @param v * @Throws urruptEdException * /public void void put (v v) Throws treamptenException {while (this.isfull ()) {// Приостановка программы здесь, и блокировка будет выпущена this.wait (); } // Если очередь не полна, то программа пробуждается, и замок будет восстановлен на этом. Doput (v); // исполнение заканчивается и разбудит другие очереди this.notifyall (); } public synchronized v take () Throws treamptenException {while (this.isempty ()) {this.wait (); } V v = this.dotake (); this.notifyall (); возврат V; }}Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!