Интерфейс очереди находится на том же уровне, что и SET и SET, и оба наследуют интерфейс коллекции. LinkedList реализует интерфейс очереди. Интерфейс очередей сужает доступ к методу LinkedList (то есть, если тип параметра в методе является очередью, он может получить доступ только к методам, определенным интерфейсом очереди, и не может быть непосредственно получить непосредственно к методам неправомерного LinkedList), так что можно использовать только соответствующий метод. BlockingQueue наследует интерфейс очереди.
Очередь - это структура данных. Он имеет две основные операции: добавление элемента в конце очереди и удаление элемента из головы очереди означает, что очередь управляет данными первым в первую очередь. Если вы попытаетесь добавить элемент в полную очередь блокировки или удалить метасектор из пустой очереди блокировки, это приведет к блокированию потока. Блокировка очередей является полезным инструментом при сотрудничестве с несколькими потоками. Рабочие потоки могут регулярно хранить промежуточные результаты в очереди блокировки, в то время как другие рабочие потоки получают промежуточные результаты и изменяют их в будущем. Очередь автоматически уравновешивает нагрузку. Если первый набор потока работает медленнее, чем второй, второй набор потока будет блокироваться в ожидании результата. Если первый набор потоков работает быстро, он будет ждать, пока второй набор потока наверстает упущенное. В следующей таблице показаны операции блокирующих очередей в JDK1.5:
Добавить MetaSearch Если очередь полна, добавьте исключение IIIegaislabeepepepeplian
Снимите удалить и вернуть элемент в головке очереди. Если очередь пуста, исключение noshelementexception.
Элемент возвращает элемент в голове очереди. Если очередь пуста, исключение noshelementexception.
Предложение добавьте элемент и возвращает true, если очередь заполнена, верните ложный
Опрос удаляет и возвращает элемент в голове очереди. Если очередь пуста, верните NULL.
Peek возвращает элемент во главе очереди. Если очередь пуст, верните ноль
Вставьте добавить элемент, если очередь полна, блокируется
Возьмите удалить и верните элемент в голову очереди. Если очередь пуста, блоки
Снимите, элемент, предложение, опрос и Peek фактически принадлежат интерфейсу очереди.
Операции, которые блокируют очередь, можно разделить на следующие три категории в соответствии с их ответами: AAD, удаление и элементные операции бросают исключения, когда вы пытаетесь добавить элементы в полную очередь или получить элементы из пустой очереди. Конечно, в многопоточной программе очередь может стать полной или пустой в любое время, поэтому вы можете использовать предложение, опрос, методы PEEK. Эти методы просто дают сообщение об ошибке, когда задача не может быть выполнена без исключения.
Примечание. Ошибки методов опроса и обзора и возврат NULL. Следовательно, незаконно вставлять нулевое значение в очередь.
Существуют также варианты метода предложений и опросов с таймаутами, например, следующие вызовы:
логический успех = Q.offer (x, 100, timeUnit.milliseconds);
Попробуйте вставить элемент в хвост очереди за 100 миллисекунд. В случае успеха, немедленно верните True; В противном случае, когда тайм -аут достигнут, верните ложь. Точно так же звоните:
Object Head = Q.Poll (100, TimeUnit.milliseconds);
Если элемент заголовка очереди успешно удален в течение 100 миллисекунд, элемент заголовка возвращается немедленно; В противном случае, нулевой возвращается, когда тайм -аут достигнут.
Наконец, у нас есть операции по блокированию. Метод PUT блокирует, когда очередь заполнена, и метод Take Blocks, когда очередь пуст.
Пакет Java.ulil.concurrent предоставляет 4 варианта блокировки очередей. По умолчанию емкость LinkedBlockquequeue не является верхним пределом (она неточна. Емкость - это целое число. Max_Value, когда не указано. Если нет, то как ее можно заблокировать, когда положить), но вы также можете указать ее максимальную емкость. Это очередь, основанная на связанном списке, который сортирует элементы FIFO (сначала в первую очередь).
ArrayBlockingQueue должен указать емкость во время строительства, и вы можете выбрать, требуется ли справедливость. Если справедливый параметр установлен True, сначала будет обработана поток с самым длинным временем ожидания (фактически, эта справедливость достигается путем установки повторного урегулирования на True: то есть поток с самым длинным временем ожидания будет работать первым). Как правило, справедливость может стоить вам производительности и использовать ее только тогда, когда это действительно необходимо. Это основная очередь блокировки, которая сортирует элементы в соответствии с принципом FIFO (первым в первом выходе).
Приоритет Blockingqueue-это очередь с приоритетом, а не первая очередь. Элементы удаляются в приоритетном порядке, а очередь не имеет верхнего предела (я посмотрел на исходный код. Приоритет Blockingqueue-это повторная обрекания приоритетов, которая основана на структуре данных. OutofmemoryError из -за истощенного ресурса), но если очередь пуста, операция, взятие элемента блокирует, поэтому его операция поиска заблокирована. Кроме того, элементы, входящие в очередь, должны иметь сравнительные возможности.
Наконец, DelesQueue (реализованная на основе приоритетной quiefue) представляет собой неограниченную очередь блокировки, которая хранит задержки, и элементы могут быть извлечены только после истечения срока задержки. Глава этой очереди является задержкой элемента с самым длинным временем хранения после истечения срока задержки. Если ни один из задержек не истекло, в очереди нет заголовков, и опрос вернется на ноль. Когда метод getDelay (TimeUnit.nanoseconds) элемента возвращает значение, меньше или равное нулю, происходит истечение, и опрос удаляет элемент. Эта очередь не допускает нулевых элементов. Вот интерфейс задержки:
Код Java
Общедоступный интерфейс задержанный Extends сопоставимо <Dosered> {Long GetDelay (UNIT UNIT); }Элемент, который ставит задержку, также будет реализовать метод сравнения, который использует его для сортировки элементов.
В следующем примере показано, как использовать очередь блокировки для управления набором потока. Программа ищет все файлы в одном каталоге и во всех ее подкаталогах, и печатает список файлов, содержащих указанные ключевые слова. Как видно из следующих примеров, две значительные преимущества использования очередей блокировки: многопоточная работа общих очередей не требует дополнительной синхронизации. Кроме того, очередь автоматически сбалансирует нагрузку, то есть, если обработка (обе стороны производства и потребления) быстро обрабатывается, она будет блокирована, тем самым уменьшая зазор скорости обработки между двумя сторонами. Ниже приведена конкретная реализация:
Код Java
Открытый класс BlockingQueTest {public static void main (string [] args) {сканер в = новый сканер (System.in); System.out.print ("Введите базовый каталог (EG /USR/LOCAL/JDK5.0/SRC):"); String Directory = in.nextline (); System.out.print («Введите ключевое слово (например, летучие):»); String Keyword = in.nextline (); final int file_queue_size = 10; // Блокирование размера очереди окончательно int search_threads = 100; // Количество поток поиска ключевых слов // Блокировка очереди на основе ArrayBlockingQueuebockequeue <File> queue = new ArrayBlockingQueue <File> (file_queue_size); // запустить только один поток для поиска файла Directory FileEnumerationTask = new FileEnumerationTask (queue, new File (Directory)); новый поток (перечисление) .start (); // запустить 100 потоков для поиска указанного ключевого слова в файле для (int i = 1; i <= search_threads; i ++) Новый поток (New SearchTask (queue, Keyword)). Start (); }} class fileEnumerationtask реализует runnable {// Dumb Metafile объект размещается в конце очереди блокировки, чтобы указать, что файл был пройден с общедоступным статическим файлом dummy = new File (""); частная блокировка <File> очередь; частный файл startDirectory; publiceEnumerationtask (blockqueue <file> queue, file startdirectory) {this.queue = queue; this.startingDirectory = startDirectory; } public void run () {try {enumerate (startDirectory); queue.put (dummy); // Выполнить здесь, чтобы указать, что файл в указанном каталоге был пройден} catch (прерывание Exception e) {}} // Поместить все файлы в указанный каталог в очередь блокировки в качестве файлов pliting void ucumerate (файловый каталог) Throhs refruptexception {fileS = файлы = файлы = directory.LiveFiles ();); для (файл файла: файлы) {if (file.isdirectory ()) enerumerate (file); else // Поместите элемент в конце очереди. Если очередь заполнена, блокируйте queue.put (file); }}} класс SearchTask реализует runnable {private blockqueue <file> queue; Ключевое слово частной строки; public SearchTask (Blockqueue <File> Queue, String Keyword) {this.Queue = queue; this.keyword = ключевое слово; } public void run () {try {boolean end = false; while (! Готово) {// Извлечь первый элемент очереди. Если очередь пуста, блокируйте файл файла = queue.take (); if (file == fileenumerationtask.dummy) {// Извлеките его и поместите так, чтобы другие потоки быстро закончились при чтении queue.put (file); выполнено = true; } else search (file); }} catch (ioException e) {e.printstacktrace (); } catch (прерывание Exception e) {}} public void search (файл файл) бросает ioException {scanner in = new Scanner (new FileInputStream (file)); int lineNumber = 0; while (in.hasnextline ()) {lineNumber ++; String line = in.nextline (); if (line.contains (ключевое слово)) system.out.printf ("%s:%d:%s%n", file.getPath (), lineNumber, line); } in.close (); }} Оригинальная ссылка: http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.