Домой Учебники по Java и J2EE Что такое потокобезопасное BlockingQueue в Java? Когда вы должны его использовать? Реализация...

Что такое потокобезопасное BlockingQueue в Java? Когда вы должны его использовать? Реализация прилагается

598
0

До сих пор я написал две статьи о концепции Producer Consumer в Crunchify. Первый для объяснения Java Semaphore и Mutex и второй для объяснения одновременного чтения / записи .

В этом Java Tutorial мы рассмотрим ту же концепцию Producer / Consumer, чтобы объяснить BlockingQueue in Java ,

Каковы преимущества блокировки очереди в Java?

java.util.Queue поддерживает операции, которые ожидают, когда очередь станет непустой при извлечении элемента, и ожидают, когда место станет доступным в очереди при сохранении элемента.

Нам нужно создать четыре Java-класса:

  1. CrunchifyMessage.java, чтобы положить и получить сообщение
  2. CrunchifyBlockingProducer.java для помещения сообщения в очередь
  3. CrunchifyBlockingConsumer.java для получения сообщения из очереди
  4. CrunchifyBlockingMain.java для запуска теста

Реализации BlockingQueue thread-safe , Все методы очередей являются атомарными по своей природе и используют внутренние блокировки .

Давайте начнем с реализации Thread-Safe BlockingQueue в Java

Шаг 1

Создать класс CrunchifyMessage.java , Это простой Java-объект .

CrunchifyMessage.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 который создал простое сообщение и поместил его в очередь .

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 crunchQueue ;
    
     общественности 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 который потребляет сообщение из очереди.

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.

CrunchifyBlockingMain.javaj

Джава
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 crunchQueue знак равно новый ArrayBlockingQueue < > ( 10 ) ;
         ХруститьБлокированиеПроизводитель ХрустПроизводитель знак равно новый CrunchifyBlockingProducer ( crunchQueue ) ;
         CrunchifyBlockingConsumer crunchConsumer знак равно новый CrunchifyBlockingConsumer ( crunchQueue ) ;
        
         // начинающий производитель для создания сообщений в очереди
         новый Нить ( хруст, производитель ) . начало ( ) ;
        
         // начинаем потребителя потреблять сообщения из очереди
         новый Тема ( crunchConsumer ) . начало ( ) ;
        
         Система. вне. println ( «Давайте начнем. Производитель / Потребительский тест начался. / n» ) ;
     }   
}

BlockingQueue не принимает нулевые элементы . Реализации генерируют исключение NullPointerException при попытках добавить , поставить или предложить нулевое значение .

Нуль используется в качестве значения дозорного указать провал опроса операций .

Результат:

Вывод CrunchifyBlockingMain.java

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 , В подобных ситуациях может быть лучше сообщить потенциальному производителю, что очередь заполнена, и быстро сдаться в случае сбоя.
    • Другими словами: производители естественно задушены.
  • Очередь блокировки обычно используется в параллельном приложении
  • Это обеспечивает правильную, поточно-ориентированную реализацию
  • Потребление памяти также должно быть ограничено
Что такое потокобезопасное BlockingQueue в Java? Когда вы должны его использовать? Реализация прилагается

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Файл свойств Java: Как прочитать значения config.properties в Java?

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

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