Несколько способов реализации модели производителя и потребителей
Возьмите пример в нашей жизни в качестве примера. Продукты, производимые фабриками, всегда экспортируются на использование снаружи. Это концепция производства и потребления.
В нашем фактическом процессе разработки программного обеспечения мы часто сталкиваемся с следующими сценариями: модуль отвечает за генерирование данных, и эти данные обрабатываются другим модулем (модуль здесь обобщен, который может быть классами, функциями, потоками, процессами и т. Д.).
Модуль, который генерирует данные, ярко называется производителем; в то время как модуль, который обрабатывает данные, называется потребителем.
Первый тип: используйте ожидание, чтобы реализовать модель производителя и потребителей
1. Производитель и потребитель:
2. Один производитель и несколько потребителей:
Второй тип: использование очередей блокировки для реализации модели производителя и потребителей
3. Используйте блокирующие очереди для реализации рисунка-производителя-потребителя
Я считаю, что все пошли на японскую кухню. Есть очень привлекательная еда, которая является барбекю. Мастер барбекю будет стоять на боку и продолжать барбекю, а затем положить жареное мясо на тарелку; И мы, посетители, которые пускают слюни, будем сидеть на стороне, и мы будем продолжать есть, пока на тарелке есть мясо.
В этой жизни мастер барбекю является продюсером, и он отвечает за барбекю. После жарки он кладет мясо на тарелку вместо того, чтобы передавать его прямо в закусочную (то есть нет необходимости уведомить закусочную о том, чтобы есть мясо). Если мясо на тарелке будет заполнено, мастер некоторое время остановится, пока кто -то не пойдет, чтобы съесть барбекю, прежде чем производить мясо; И посетители просто смотрят на тарелку, и как только на тарелке есть мясо, мы несем ответственность за ее съедание;
В течение всего процесса посетители и мастер барбекю не имели дело напрямую друг с другом, а взаимодействовали с тарелкой.
Пластина действует как буферная концепция. Если что -то произведено, поместите его. На пластине также есть ограничение размера. Если он превышает размер тарелки, он заблокирует производство производителя и ждат, пока потребитель потребляет; Когда тарелка пуста, она заблокирует потребление потребителей и будет ждать производства производителя.
Блокирование очереди во время программирования может реализовать функцию диска.
Характеристики блокировки очередей:
Когда элемент очереди заполнен, заблокируйте операцию вставки;
Когда элемент очереди пуст, операция сбора заблокирована.
Как Arrayblockingqueue, так и поддержка LinkedBlockingQueue FIFO (сначала, сначала), но LinkedBlockingQueue не ограничен, в то время как ArrayBlockingQueue ограничена.
Следующее использует блокирующие очереди для реализации производителей и потребителей:
Продюсер:
import java.util.concurrent.blockqueue; Public Class Producer реализует Runnable {Private Final Blockqueue Blockqueue; // Установить размер кэша очередей. Производство будет временно остановлено после превышения этого размера во время производственного процесса. Private Final int queue_size = 10; Public Producer (Blockqueue Blockingqueue) {this.blockqueue = blockqueue;} int task = 1; @Override public void run () {while (true) {try {System.out.println («Производство:«+задача); // Поставлено в образованный продукт в Queue -blockeue. Некоторое время, чтобы облегчить просмотр потока эффекта. Sleep (1000);} Catch (прерывание Exception e) {e.printstackTrace ();}}}}потребитель:
Импорт java.util.concurrent.blockqueue; // потребительский общедоступный класс потребительские внедрения. {System.out.println ("untucing:" + blockqueue.take ()); // Пусть он на некоторое время остановится, чтобы облегчить просмотр потока эффекта. Sleep (2000);} Catch (прерывание Exception e) {e.printstacktrace ();}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}тест:
Импорт java.util.concurrent.blockqueue; import java.util.concurrent.linkedblockqueue;/** * Режим потребительского продюсера * Используйте блокирующие очередь блокировки * @author wanggenshen * */public class testconpro {public static void (String) {blockqueue). P = новый производитель (Blockqueue); потребитель C = новый потребитель (BlockqueQueue); Thread TP = новый поток (P); Thread TC = новый поток (c); TP.Start (); TC.Start ();}}Поскольку LinkedBlockingQueue - это неограниченная очередь, производители будут продолжать производить, поместить произведенные задачи в очередь, а потребители будут потреблять в очереди:
Если вы используете ограниченную блокирующую очередь ArrayBlockingQueue, вы можете инициализировать размер очереди. Затем, когда элементы в очереди превышают размер очереди, производитель будет ждать, пока потребитель будет потреблять один, а затем произведет другой:
Тестовый код:
Инициализируйте ArrayBlockingQueue размера 10:
Public Static void Main (String [] args) {Blockqueue Blockqueue = new Arrayblockingqueue (10); производитель p = новый производитель (Blockqueue); потребитель C = новый потребитель (Blockqueue); Thread TP = New Thread (P); Thread TC = New Thread (C); TP.Start (); TC.Start ();};Во время теста производителям было разрешено производить немного быстрее, в то время как потребители были медленнее. Вы можете видеть, что разница между производимым серийным номером продукта и потребляемым серийным номером продукта всегда 10 (размер очереди):
Суммировать
Выше приведено все содержание этой статьи о методе реализации модели потребителей производства и примерах кода проблем безопасности потоков. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!