В този урок ще научим за интерфейса 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
се счита за безопасно събиране на нишки . Това е така, защото може да бъде полезно при операции с много нишки.
Да предположим, че една нишка вмъква елементи в опашката, а друга нишка премахва елементи от опашката.
Сега, ако първата нишка работи по-бавно, тогава блокиращата опашка може да накара втората нишка да изчака, докато първата нишка завърши своята операция.