Если BlockingQueue заполнена, любая операция, которая пытается хранить вещи в нем, будет заблокирована и не будет пробуждена, чтобы продолжить работу, пока не появится новое место в Blockingqueue.
Основными методами, предоставленными BlockingQueue:
Добавить (anobject): добавьте Anobject в Blockqueue.
Предложение (Anobject): Добавьте Anobject в Blockqueue.
Поместите (anobject): добавьте Anobject в Blockqueue.
Опрос (время): Сначала выберите объект, ранжированный в Blockqueue. Возвращает ноль, когда его нельзя получить.
Take (): Сначала выберите объект, ранжированный в блокировке.
Существует 4 конкретных реализации блокировки в соответствии с различными потребностями:
(1) Arrayblockingqueue: конструктор указанного размера должен иметь параметр int, чтобы указать его размер. Объекты, которые он содержит, отсортированы в порядке FIFO (первое, сначала).
(2) LinkedBlockingqueue: BlockingQueue с различным размером.
Если параметр размера не включен, размер сгенерированной блокировки определяется integer.max_value. Объекты, которые он содержит, отсортированы в порядке FIFO (первое, сначала).
По сравнению с LinkedBlockingqueue и ArrayBlockingQueue структуры данных, используемые за ними, различны.
Пропускная способность данных LinkedBlockingQueue больше, чем у ArrayBlockingQueue, но их предсказуемость производительности ниже, чем у ArrayBlockingQueue, когда количество резьбов большое.
(3) Приоритет BlockingQueue: аналогично LinkedBlockingQueue, но сортировка объектов, которые он содержит, не является FIFO, но определяется естественным порядком сортировки объектов или порядком, определяемым компаратором, принесенным конструктором.
(4) Synchronousqueue: специальная блокировка, ее работа должна быть заполнена попеременно, положив и забрав.
Кода -копия выглядит следующим образом:
пакет com.yao;
Импорт java.util.concurrent.arrayblockingqueue;
импортировать java.util.concurrent.blockqueue;
импортировать java.util.concurrent.executorservice;
импортировать java.util.concurrent.executors;
открытый класс блокировка
/**
Определение корзины для яблока
*/
общедоступная статическая корзина класса {
// корзина, способная держать 3 яблока
Blockingqueue <string> CASTER = NEW ArrayBlockingQueue <string> (3);
// производить яблоки и положить их в корзину
public void -продукт () бросает прерывание
// Поместите яблоко в метод POT.
Basket.put («яблоко»);
}
// потреблять яблоки и вывести их из корзины
public String unsume () бросает прерывание
// Получить метод снимает яблоко.
String apple = basket.take ();
вернуть яблоко;
}
public int getApplenumber () {
return Casket.size ();
}
}
// метод испытания
public static void testbasket () {
// Создать корзину с яблоками
Конечная корзина = новая корзина ();
// определить производителя Apple
Производитель класса реализует Runnable {
public void run () {
пытаться {
while (true) {
// производить яблоко
System.out.println («Производитель готов к созданию яблок:»
+ System.currentTimeMiLsis ());
корзина.produce ();
System.out.println («Производитель закончил производство яблок:»
+ System.currentTimeMiLsis ());
System.out.println ("После производства есть яблоки:"+captapplenumber ()+");
// 300 мс сна
Thread.sleep (300);
}
} catch (прерванная экспрессия ex) {
}
}
}
// определять потребителей яблоков
Класс потребительские реализует Runnable {
public void run () {
пытаться {
while (true) {
// потребление Apple
System.out.println («Потребители готовы потреблять Apple:»
+ System.currentTimeMiLsis ());
корзина.consume ();
System.out.println («Потребитель потребляет Apple»
+ System.currentTimeMiLsis ());
System.out.println ("После потребления есть яблоки:"+captapplenumber ()+");
// 1000ms Sleep
Thread.sleep (1000);
}
} catch (прерванная экспрессия ex) {
}
}
}
Executorservice service = executors.newcachedthreadpool ();
Производитель продюсер = новый производитель ();
Потребительский потребитель = новый потребитель ();
Service.submit (производитель);
Service.submit (потребитель);
// после того, как программа работает в течение 10 секунд, все задачи будут остановлены
пытаться {
Thread.sleep (10000);
} catch (прерванная экспрессия e) {
}
service.shutdownnow ();
}
public static void main (string [] args) {
BlockingQueuetest.testbasket ();
}
}