1. Концепция
Проблема производителей и потребителей является проблемой многопоточного сотрудничества в Джиндиане. Производители несут ответственность за производство продуктов и хранение их на складе; Потребители получают продукты со склада и потребляют их. Когда склад будет заполнен, производитель должен остановить производство, пока не появится место для хранения продукта; Когда склад пуст, потребитель должен остановить потребление, пока на складе не появится продукт.
Следующие методы в основном используются для решения задач производителя/потребителей: 1. Используйте потоки для моделирования производителей и непрерывно хранить продукты на складе в методе пробега. 2. Используйте потоки для моделирования потребителей и непрерывно получить продукты со склада в методе Run. 3
А Класс склада спасает продукт. Когда количество продуктов составляет 0, вызывается метод ожидания, в результате чего текущий потребительский поток входит в состояние ожидания. Когда новый продукт сохраняется, метод уведомления вызывается, чтобы разбудить поток потребителей ожидания. Когда склад будет заполнен, метод ожидания вызывается, в результате чего текущий поток производителя входит в состояние ожидания. Когда потребитель получает продукт, метод уведомления вызывается для разбуждения потока производителя ожидания.
2. Примеры
пакет книга. this.warehouse = склад; } public void start () {this.running = true; Super.Start (); } public void run () {продукт продукта; try {while (running) {// Получить продукт от склада продукта = Warehouse.getProduct (); сон (500); }} catch (прерывание Exception e) {e.printStackTrace (); }} // Остановить потребительскую тему public void stopconsumer () {synchronized (Warehouse) {this.running = false; warehouse.notifyall (); // Уведомление потока в ожидании склада}} //, использует ли потребительский поток Public Boolean Isrunning () {return running; }} пакетный книга. this.warehouse = склад; } public void start () {this.running = true; Super.Start (); } public void run () {продукт продукта; // Создание и сохраняет продукт try {while (running) {product = new Product ((++ productName)+""); this.warehouse.storageProduct (продукт); сон (300); }} catch (прерывание Exception e) {e.printStackTrace (); }} // Остановить потоку производителя public void stopproducer () {synchronized (склад) {this.running = false; // Уведомить поток в ожидании склада склада Warehouse Warehouse.notifyall (); }} // независимо от того, работает ли поток продюсера Public Boolean isrunning () {return running; }} пакет книга.Thread.product; Public Class Product {Private String name; // имя продукта Public Product (String name) {this.name = name; } public String toString () {return "Product-"+name; }} пакетные книга. private int ud = 0; // script of the Last Consummed Product на складе плюс 1 Public Warehouse () {this.products = новый продукт [емкость]; } public Warehouse (int емкость) {this (); if (емкость> 0) {емкость = емкость +1; this.products = новый продукт [емкость]; }} // Получить продукт со склада общедоступного продукта getProduct () throws прерывание {синхронизированный (this) {boolean consumerrunning = true; // Tag, независимо от того, работает ли потребительский поток. } else {return null; // не потребитель может получить продукт} // Если потребительский поток работает, но на складе нет продукта, потребительский поток продолжает ждать, пока ((Front == Bult) && ConsumerRunning) {wait (); ConsumerRunning = ((потребитель) CurrentThread) .Isrunning (); } // Если потребительский поток перестал работать, выйдите из метода и отмените продукт if (! ConsumerRunning) {return null; } // Получить первый продукт, который не был использован в настоящее время продукт продукта = продукт [Front]; System.out.println ("Consumer ["+currentThread.getName ()+"] getProduct:"+product); // переместить подписание в настоящее время бессомодействующего продукта обратно один за другим, если он достигает конца массива, перейдите к фронту заголовка = (Front+1+емкость)%емкость; System.out.println («Количество продуктов, еще не потребляемых на складе:«+(задний+-фронт)%емкость); // Уведомление о других потоках ожидания notify (); вернуть продукт; }} // Хранение продукта на складе Public void Storage -Product (продукт продукт) Throws refruptExexception {synchronized (this) {boolean produceerrunning = true; // Подписать, работает ли поток производителя. if (CurrentThread Encems of Produceer) {ProductErrunning = (((продюсер) CurrentThread) .Isrunning (); } else {return; } // Если последний бессосенный продукт находится рядом со подписью первого бессосновного продукта, это означает, что нет места для хранения. // Если нет места для хранения, и поток производителя все еще работает, нить производителя ждет, пока склад отпустит продукт, в то время как (((задний+1)%емкость == Front) && Producterrunning) {wait (); Производство = ((продюсер) CurrentThread) .Isrunning (); } // Если производственный поток прекратился, хранилище продукта останавливается, если (! Производство) {return; } // Сохранить продукт на складские продукты [задний] = продукт; System.out.println ("Производитель [" + thread.currentThread (). GetName () + "] хранилище:" + product); // Измените задний индекс на один за другим. Задний = (задний + 1)%емкость; System.out.println («Количество продуктов, не потребляемых на складе:« + (задний + емкость -фронт)%емкость); notify (); }}} упаковочный книга. Производители производителей2 = новый продюсер (склад, «Производитель-2»); Производители продюсеров3 = новый продюсер (Warehouse, «Производитель-3»); Потребительский потребитель1 = новый потребитель (склад, "Consumer-1"); Потребительский потребитель2 = новый потребитель (склад, "Consumer-2"); Потребительский потребитель3 = новый потребитель (склад, "Consumer-3"); Потребительский потребитель4 = новый потребитель (склад, "Consumer-4"); // Запуск потока производителя и потребительский поток производит1.start (); Производители2.start (); Consumer1.start (); Производители3.start (); Consumer2.start (); Consumer3.start (); Consumer4.start (); // Пусть программа производителя/потребителя запустится на 1600 мс try {thread.sleep (1600); } catch (прерванное искусство e) {e.printstacktrace (); } // Остановить потребительский поток производит1.stopproducer (); Consumer1.stopconsumer (); Производители2.stopproducer (); Consumer2.stopConsumer (); Производители3.stopProducer (); Consumer3.stopConsumer (); Consumer4.stopConsumer (); }}Результат вывода:
Производник [Produce-1] Продукт хранения: количество продуктов, которые не использовались на складе Product-1: 1-обратный [Consumer-2] GetProduct: количество продуктов, которые не использовались на складе продукта-1: 0Producer [Product-3] Hore Product: количество продуктов, которые не поглощены продуктам. не использовались на складе Product-2: 2cosmer [Consumer-3] GetProduct: количество продуктов, которые не использовались на складе Product-3: 1consumer [Consumer-1] GetProduct: количество продуктов, которые не потреблялись на складе продукта-2: 0producer [Produce-1]. 1Consumer[consumer-4] getProduct: The number of products that have not been consumed in the Product-4 warehouse: 0Producer[producter-3] storageProduct: The number of products that have not been consumed in the Product-6 warehouse: 1Producer[producter-2] storageProduct: The number of products that have not been consumed in the Product-5 warehouse: 2Consumer[consumer-1] GetProduct: количество продуктов, которые не использовались на складе Product-6: 1consumer [Consumer-2] GetProduct: количество продуктов, которые не были потреблены на складе Product-5: 0producer [ProductTr-1] HorePduct: количество продуктов, которые не потреблялись в продукте, не получали продукта, которые не были потребляемыми. На складе Product-7: 0Producer [ProductTr-3] Хранение Продукт: количество продуктов, которые не использовались на складе Product-8: 1Producer [Producer-2] Хранилище. 1Producer [PRODECTTR-1] Хранение Продукт: Продукт-10 Количество продуктов, которые не использовались на складе: 2PRODUCER [PRODECTR-3] Хранение Продукт: Продукт-11 Количество продуктов, которые не были потреблены на складе: 3PRODUCER [PRODECTR-2] СПОСПОЛНИТЕЛЬНОСТИ: Продукт-1 Продукт, которые не поглощены продуктам, которые не поглощены продуктам: Потребляется. Количество продуктов, которые не использовались на складе: 3-й на складе. 2Producer [PRODECTTR-1] Хранение Продукт: Продукт-14 Количество продуктов, которые не использовались на складе: 3Producer [Производитель-2] Продукт хранилища: Продукт-15 Количество продуктов, которые не использовались на складе: 4-обратный [потребитель-4] getProduct: Продукт-1. Количество продуктов, которые не использовались на складе: 2-й на складе. 3Producer [ProductTr-2] хранилище: количество продуктов, которые не использовались на складе продукта-18: 4
Анализ: склад продукта устанавливается в основном методе, а склад не ассоциирует 3 потока производителей и 4 потребительских потоков. Эти темы начинают заставлять производителя/потребительскую модель работать. Когда программа работает на 1600 мс, все производители перестают производить продукты, а потребители перестают потреблять продукты.
Продукт «Производитель» производит продукт без 300 мс в методе пробега и хранит его на складе; Потребитель потребительских потоков берет продукт со склада без 500 мс в методе пробега.
Склад отвечает за хранение и распространение продуктов. Метод продукта хранилища отвечает за хранение продукта. Когда склад будет заполнен, текущий поток входит в состояние ожидания, то есть, если производителя резьбы вызывает метод хранилища для хранения продукта, он обнаруживает, что склад заполнен и не может быть сохранен, он войдет в состояние ожидания. Когда продукт хранения успешно, метод уведомления вызывается для разбуждения потребительского потока ожидания.
Метод GetProduct отвечает за продукт заранее. Когда склад пуст, текущая поток входит в состояние ожидания. То есть, если потребительский поток B вызывает метод GetProduct для получения продукта, он обнаруживает, что склад пуст, он введет состояние ожидания. Когда продукт успешно извлечен, метод уведомления вызывается для разбуждения потока производителя ожидания.
В приведенной выше статье кратко обсуждаются проблемы производителей и потребителей в потоках Java - это все контент, которым я делюсь с вами. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.