Интерфейс на Java BlockingQueue

В този урок ще научим за интерфейса Java BlockingQueue и неговите методи.

В BlockingQueueинтерфейса на Java Collectionsрамка разширява Queueинтерфейс. Тя позволява на всяка операция да изчака, докато може да бъде успешно извършена.

Например, ако искаме да изтрием елемент от празна опашка, тогава блокиращата опашка позволява операцията за изтриване да изчака, докато опашката съдържа някои елементи, които трябва да бъдат изтрити.

Класове, които прилагат BlockingQueue

Тъй като BlockingQueueе интерфейс, не можем да осигурим директното му изпълнение.

За да използваме функционалността на BlockingQueue, трябва да използваме класове, които я реализират.

  • ArrayBlockingQueue
  • LinkedBlockingQueue

Как да използвам блокиращи опашки?

Трябва да импортираме java.util.concurrent.BlockingQueueпакета, за да го използваме BlockingQueue.

 // Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue(); 

Тук сме създали обекти animal1 и animal2 от класове ArrayBlockingQueueи LinkedBlockingQueue, съответно. Тези обекти могат да използват функционалностите на BlockingQueueинтерфейса.

Методи на BlockingQueue

Въз основа на това дали опашката е пълна или празна, методите на блокиращата опашка могат да бъдат разделени на 3 категории:

Методи, които хвърлят изключение

  • add()- Вмъква елемент в блокиращата опашка в края на опашката. Изхвърля изключение, ако опашката е пълна.
  • element()- Връща главата на блокиращата опашка. Изхвърля изключение, ако опашката е празна.
  • remove()- Премахва елемент от блокиращата опашка. Изхвърля изключение, ако опашката е празна.

Методи, които връщат някаква стойност

  • offer()- Вмъква посочения елемент в блокиращата опашка в края на опашката. Връща, falseако опашката е пълна.
  • peek()- Връща главата на блокиращата опашка. Връща, nullако опашката е празна.
  • poll()- Премахва елемент от блокиращата опашка. Връща, nullако опашката е празна.

Още в офертата () и анкета ()

Методът offer()and и poll()може да се използва с изчаквания. Тоест, можем да предадем времеви единици като параметър. Например,

 offer(value, 100, milliseconds) 

Тук,

  • value е елементът, който трябва да се вмъкне в опашката
  • И сме задали време за изчакване от 100 милисекунди

Това означава, че offer()методът ще се опита да вмъкне елемент в блокиращата опашка за 100милисекунди. Ако елементът не може да бъде вмъкнат за 100 милисекунди, методът се връща false.

Забележка: Вместо да milliseconds, ние можем да използваме тези единици време: days, hours, minutes, seconds, microsecondsи nanosecondsв offer()и poll()методи.

Методи, които блокират операцията

Също BlockingQueueтака предоставя методи за блокиране на операциите и изчакване, ако опашката е пълна или празна.

  • put()- Вмъква елемент в блокиращата опашка. Ако опашката е пълна, тя ще изчака, докато опашката има място за вмъкване на елемент.
  • take()- Премахва и връща елемент от блокиращата опашка. Ако опашката е празна, тя ще изчака, докато опашката има елементи за изтриване.

Да предположим, че искаме да вмъкнем елементи в опашка. Ако опашката е пълна, тогава put()методът ще изчака, докато опашката има място за вмъкване на елементи.

По същия начин, ако искаме да изтрием елементи от опашката. Ако опашката е празна, take()методът ще изчака, докато опашката съдържа елементи за изтриване.

Внедряване на BlockingQueue в ArrayBlockingQueue

 import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) ) 

Изход

 BlockingQueue: (2, 1, 3) Премахнат елемент: 2 

За да научите повече за ArrayBlockingQueue, посетете Java ArrayBlockingQueue.

Защо BlockingQueue?

В Java BlockingQueueсе счита за безопасно събиране на нишки . Това е така, защото може да бъде полезно при операции с много нишки.

Да предположим, че една нишка вмъква елементи в опашката, а друга нишка премахва елементи от опашката.

Сега, ако първата нишка работи по-бавно, тогава блокиращата опашка може да накара втората нишка да изчака, докато първата нишка завърши своята операция.

Интересни статии...