Содержание
До сих пор я написал две статьи о концепции Producer Consumer в Crunchify. Первый для объяснения Java Semaphore и Mutex и второй для объяснения одновременного чтения / записи .
В этом Java Tutorial мы рассмотрим ту же концепцию Producer / Consumer, чтобы объяснить BlockingQueue in Java ,
Каковы преимущества блокировки очереди в Java?
java.util.Queue поддерживает операции, которые ожидают, когда очередь станет непустой при извлечении элемента, и ожидают, когда место станет доступным в очереди при сохранении элемента.

Нам нужно создать четыре Java-класса:
- CrunchifyMessage.java, чтобы положить и получить сообщение
- CrunchifyBlockingProducer.java для помещения сообщения в очередь
- CrunchifyBlockingConsumer.java для получения сообщения из очереди
- CrunchifyBlockingMain.java для запуска теста
Реализации BlockingQueue thread-safe , Все методы очередей являются атомарными по своей природе и используют внутренние блокировки .
Давайте начнем с реализации Thread-Safe BlockingQueue в Java
Шаг 1
Создать класс CrunchifyMessage.java , Это простой Java-объект .
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
пакет ком . crunchify. пример ;
/ **
* @author Crunchify.com
* простой класс сообщений, чтобы поставить и получить сообщение в очередь
* /
общественности учебный класс CrunchifyMessage {
частный строка crunchifyMsg ;
общественности CrunchifyMessage ( String строка ) {
это. crunchifyMsg знак равно строка ;
}
общественности строка getMsg ( ) {
вернуть crunchifyMsg ;
}
}
|
Шаг 2
Создать продюсера CrunchifyBlockingProducer.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. одновременно. BlockingQueue ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyBlockingProducer инвентарь Runnable {
частный BlockingQueue
общественности CrunchifyBlockingProducer ( BlockingQueue
это. crunchQueue знак равно очередь ;
}
@Override
общественности недействительным запустить ( ) {
// создаем сообщения CrunchifyMessage
за ( int я знак равно 1 ; я < = 5 ; я ++ ) {
CrunchifyMessage msg знак равно новый CrunchifyMessage ( Я - сообщение + я ) ;
пытаться {
Thread. сон ( 10 ) ;
crunchQueue . положить ( MSG ) ;
Система. вне. println ( CrunchifyBlockingProducer: Сообщение - + сообщ. getMsg ( ) + производится ) ;
} ловить ( Исключение е ) {
Система. вне. println ( «Исключение:» + е ) ;
}
}
// добавление сообщения о выходе
CrunchifyMessage msg знак равно новый CrunchifyMessage ( «Все сделано со стороны производителя. Произведено 50 CrunchifyMessages» ) ;
пытаться {
crunchQueue . положить ( MSG ) ;
Система. вне. println ( CrunchifyBlockingProducer: Выходное сообщение - + сообщ. getMsg ( ) ) ;
} ловить ( Исключение е ) {
Система. вне. println ( «Исключение:» + е ) ;
}
}
}
|
Шаг 3
Создать класс CrunchifyBlockingConsumer.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
|
пакет ком . crunchify. пример ;
Импортировать Java. Util. одновременно. BlockingQueue ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyBlockingConsumer инвентарь Runnable {
частный BlockingQueue
общественности CrunchifyBlockingConsumer ( BlockingQueue
это. очередь знак равно очередь ;
}
@Override
общественности недействительным запустить ( ) {
пытаться {
CrunchifyMessage msg ;
// использование сообщений до получения сообщения о выходе
в то время как ( ( сообщение знак равно очереди. взять ( ) ) . getMsg ( ) ! знак равно выход ) {
Thread. сон ( 10 ) ;
Система. вне. println ( CrunchifyBlockingConsumer: Сообщение - + сообщ. getMsg ( ) + потребляется. ) ;
}
} ловить ( InterruptedException е ) {
эл . printStackTrace ( ) ;
}
}
}
|
Шаг 4
Создать простой CrunchifyBlockingMain.java метод, который запускает тест BlockingQueue. Запустите эту программу, чтобы проверить поведение BlockingQueue.
|
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
|
пакет ком . crunchify. пример ;
Импортировать Java. Util. одновременно. ArrayBlockingQueue ;
Импортировать Java. Util. одновременно. BlockingQueue ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyBlockingMain {
общественности статический недействительным main ( Строка [ ] аргументы ) {
// Создание BlockingQueue размера 10
// BlockingQueue поддерживает операции, ожидающие, пока очередь не станет пустой при извлечении элемента, и
// ждем, пока пространство станет доступным в очереди при сохранении элемента.
BlockingQueue
ХруститьБлокированиеПроизводитель ХрустПроизводитель знак равно новый CrunchifyBlockingProducer ( crunchQueue ) ;
CrunchifyBlockingConsumer crunchConsumer знак равно новый CrunchifyBlockingConsumer ( crunchQueue ) ;
// начинающий производитель для создания сообщений в очереди
новый Нить ( хруст, производитель ) . начало ( ) ;
// начинаем потребителя потреблять сообщения из очереди
новый Тема ( crunchConsumer ) . начало ( ) ;
Система. вне. println ( «Давайте начнем. Производитель / Потребительский тест начался. / n» ) ;
}
}
|
BlockingQueue не принимает нулевые элементы . Реализации генерируют исключение NullPointerException при попытках добавить , поставить или предложить нулевое значение .
Нуль используется в качестве значения дозорного указать провал опроса операций .
Результат:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Давайте начнем. Испытание производителя / потребителя началось.
CrunchifyBlockingProducer: Сообщение - я»м тзд 1 производится .
CrunchifyBlockingProducer : Сообщение - Я получил 2 сообщения.
CrunchifyBlockingConsumer: Сообщение - я»м тзд 1 потребляется .
CrunchifyBlockingConsumer : Сообщение - Я MSG 2 потребляется.
CrunchifyBlockingProducer: Сообщение - я»м тзд 3 производится .
CrunchifyBlockingConsumer : Сообщение - Я MSG 3 потребляется.
CrunchifyBlockingProducer: Сообщение - я»м тзд 4 производится .
CrunchifyBlockingConsumer : Сообщение - Я MSG 4 потребляется.
CrunchifyBlockingProducer: Сообщение - я»м тзд 5 производится .
CrunchifyBlockingProducer : Выход из сообщения - Все сделано со стороны продюсера . произведенный 50 CrunchifyMessages
CrunchifyBlockingConsumer : Сообщение - я 'м тзд 5 потребляется .
CrunchifyBlockingConsumer : Сообщение - Все сделано со стороны продюсера . произведенный 50 CrunchifyMessages потребляется .
|
Когда мы должны использовать java.util.concurrent.BlockingQueue?
- Если вы хотите , чтобы задушить какое - то из входящего запроса , то вы должны использовать те же
- Производители могут значительно опередить потребителей с неограниченной очередью. Если потребитель не догоняет производителя, это может вызвать
OutOfMemoryError, В подобных ситуациях может быть лучше сообщить потенциальному производителю, что очередь заполнена, и быстро сдаться в случае сбоя.- Другими словами: производители естественно задушены.
- Очередь блокировки обычно используется в параллельном приложении
- Это обеспечивает правильную, поточно-ориентированную реализацию
- Потребление памяти также должно быть ограничено
0.00 (0%) 0 votes








