Домой Учебники по Java и J2EE Как создать свою собственную неблокирующую очередь фиксированного размера в Java? То же,...

Как создать свою собственную неблокирующую очередь фиксированного размера в Java? То же, что EvictingQueue

588
0

Если вы не хотите использовать Google Guava's EvictingQueue внешняя зависимость в вашем Java Enterprise Project, тогда вы должны рассмотреть возможность создания собственного non-blocking, fixed size queue ,

В основном мы хотим избежать java.lang.IllegalStateException: Queue full исключение , которое вы, возможно, заметили в предыдущем уроке ArrayBlockingQueue Vs. ВыселениеQueue .

Очередь трассировки полного стека из Eclipse Console

1
2
3
4
5
6
Возникло исключение :
Java. яз. IllegalStateException : Очередь заполнена
в Яве . Util. АннотацияВопрос . добавить ( AbstractQueue . Java : 98 )
в Яве . Util. одновременно. ArrayBlockingQueue . добавить ( ArrayBlockingQueue . Java : 312 )
в crunchify. ком . учебник . CrunchifyArrayBlockingQueueVsEvictingQueue . CrunchifyArrayBlockingQueue ( CrunchifyArrayBlockingQueueVsEvictingQueue . Java : 23 )
в crunchify. ком . учебник . CrunchifyArrayBlockingQueueVsEvictingQueue . main ( CrunchifyArrayBlockingQueueVsEvictingQueue . java : 41 )

У вас тоже есть below questions ? Тогда вы находитесь в правильном месте:

  • Есть ли очередь фиксированного размера, которая удаляет лишние элементы
  • Статическая (фиксированный размер) синглтон-очередь
  • Есть ли реализация PriorityQueue с фиксированной емкостью

Давайте начнем

  1. Создать класс CrunchifyNonBlockingFixedSizeQueue который расширяет класс ArrayBlockingQueue
  2. Создайте constructor и инициализировать класс с предоставленным размером
  3. @Override add(E e) работа с нашей собственной реализацией
    • Перед добавлением элемента проверьте, достигли ли мы максимального размера
    • если (максимальный размер), удалить элемент из головы
    • затем добавьте новый элемент

Полная реализация

CrunchifyNonBlockingFixedSizeQueue.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
пакет crunchify. ком . учебник ;
Импортировать Java. Util. одновременно. ArrayBlockingQueue ;
/ **
* @author Crunchify.com Не стесняйтесь использовать это в своем корпоративном Java-проекте
* /
общественности учебный класс CrunchifyNonBlockingFixedSizeQueue продолжается ArrayBlockingQueue {
/ **
* сгенерированный серийный номер
* /
частный статический окончательный долго serialVersionUID знак равно 7772085623838075506L ;
// размер очереди
частный ИНТ размер ;
// Конструктор
общественности CrunchifyNonBlockingFixedSizeQueue ( int crunchifySize ) {
// Создает ArrayBlockingQueue с заданной (фиксированной) емкостью и политикой доступа по умолчанию
супер ( crunchifySize ) ;
это. размер знак равно crunchifySize ;
}
// Если очередь заполнена, она удалит самый старый / первый элемент из очереди, например FIFO
// Нужен ли метод add () для синхронизации? Как вы думаете?
@Override
синхронизированный общественности логический добавить ( E е ) {
// Проверить, не заполнена ли уже очередь?
если ( супер . размер ( ) == это. размер ) {
// удаляем элемент из очереди, если очередь заполнена
это. удалить ( ) ;
}
вернуть супер. добавить ( е ) ;
}
}

Как проверить?

CrunchifyNonBlockingFixedSizeQueueTest.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
пакет crunchify. ком . учебник ;
Импортировать Java. Util. одновременно. ArrayBlockingQueue ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyNonBlockingFixedSizeQueueTest {
общественности статический недействительным main ( Строка [ ] аргументы ) {
// Тест ArrayBlockingQueue с размером 10
CrunchifyOwnNonBlockingFixedSizeQueue ( ) ;
}
частный статический недействительным CrunchifyOwnNonBlockingFixedSizeQueue ( ) {
// crunchifyQueue с типом CrunchifyNonBlockingFixedSizeQueue
ArrayBlockingQueue crunchifyQueue знак равно новый CrunchifyNonBlockingFixedSizeQueue ( 10 ) ;
строка crunchifyMsg знак равно Это CrunchifyNonBlockingFixedSizeQueueTest — ;
пытаться {
// цикл 15 раз — ошибки нет даже после заполнения очереди
за ( int я знак равно 1 ; я < = 15 ; я ++ ) {
crunchifyQueue . добавить ( crunchifyMsg + я ) ;
log ( CrunchifyNonBlockingFixedSizeQueueTest size: + crunchifyQueue . размер ( ) ) ;
}
} ловить ( Исключение е ) {
log ( / nException произошла: ) ;
эл . printStackTrace ( ) ;
}
}
частный статический недействительным log ( Строка crunchifyText ) {
Система. вне. println ( crunchifyText ) ;
}
}

Результат: нет ошибки переполнения очереди

Вывод CrunchifyNonBlockingFixedSizeQueueTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CrunchifyNonBlockingFixedSizeQueueTest size : 1
CrunchifyNonBlockingFixedSizeQueueTest size : 2
CrunchifyNonBlockingFixedSizeQueueTest size : 3
CrunchifyNonBlockingFixedSizeQueueTest size : 4
CrunchifyNonBlockingFixedSizeQueueTest size : 5
CrunchifyNonBlockingFixedSizeQueueTest size : 6
CrunchifyNonBlockingFixedSizeQueueTest size : 7
CrunchifyNonBlockingFixedSizeQueueTest size : 8
CrunchifyNonBlockingFixedSizeQueueTest size : 9
CrunchifyNonBlockingFixedSizeQueueTest size : 10
CrunchifyNonBlockingFixedSizeQueueTest size : 10    < == Нет ошибки переполнения очереди
CrunchifyNonBlockingFixedSizeQueueTest size : 10
CrunchifyNonBlockingFixedSizeQueueTest size : 10
CrunchifyNonBlockingFixedSizeQueueTest size : 10
CrunchifyNonBlockingFixedSizeQueueTest size : 10

Как вы могли заметить здесь — у нас есть synchronized add(E e) Метод в нашей утилите. Do you think we should do it ? Что если несколько элементов пытаются добавить элементы и очередь заполнена?

Как создать свою собственную неблокирующую очередь фиксированного размера в Java? То же, что EvictingQueue

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  В Java как создать надежный случайный пароль - SecureRandom Complete Tutorial

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь