Скопируйте код кода следующим образом:
состояние упаковки;
импортировать java.util.ArrayList;
импортировать java.util.List;
импортировать java.util.concurrent.locks.Condition;
импортировать java.util.concurrent.locks.Lock;
импортировать java.util.concurrent.locks.ReentrantLock;
/**
* Используйте Lock и Condition для реализации модели производитель-потребитель.
* @author будет
*
*/
общественный класс ProducerConsumerDemo {
public static void main(String[] args) {
INT ProducerCount = 10;
INT ConsumerCount = 15;
Final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5 // Размер буфера равен 5);
Thread[] ProducerThreads = новый Thread[producerCount];
for(int i = 0; я <productCount; я++) {
ProducerThreads[i] = new Thread("продюсер" + (i+1)) {
@Override
общественный недействительный запуск () {
пкд.продукт();
}
};
}
Thread [] ConsumerThreads = новый поток [consumerCount];
for(int j = 0; j <consumerCount; j++) {
ConsumerThreads[j] = новый поток("потребитель" + (j+1)) {
@Override
общественный недействительный запуск () {
пкд.потреблять();
}
};
}
//Запускаем поток-производитель-потребитель
for(int i = 0; я <productCount; я++) {
ProducerThreads[i].start();
}
for(int j = 0; j <consumerCount; j++) {
ConsumerThreads[j].start();
}
}
частный статический финал int DEFAULT_BUFFER_SIZE = 10;
частный intufferSize // размер буфера;
частный список<Object> bufferList;
частная окончательная блокировка блокировки = новый ReentrantLock (истина);
частное окончательное условие условие = lock.newCondition();
public ProducerConsumerDemo (intufferSize) {
this.bufferSize =ufferSize> 0? bufferSize: DEFAULT_BUFFER_SIZE;
ufferList = новый ArrayList<Object>(bufferSize);
}
// Производство
общественная недействительная продукция () {
блокировка.блокировка(); // блокировка
пытаться {
while(bufferList.size() == bufferSize) { // Буфер заполнен
System.out.println("Ожидание производителя, поток: " + Thread.currentThread().getName());
условие.ожидание();
}
// Производство
ufferList.add(новый объект());
System.out.println("Производитель создает один, теперь размер буфера: "
+ufferList.size() + "и поток: " + Thread.currentThread().getName());
условие.signalAll(); // Уведомление потребителей
} catch(InterruptedException e) {
е.printStackTrace();
} окончательно {
блокировка.разблокировка();
}
}
// Потребление
общественный недействительный потреблять () {
блокировка.блокировка(); // блокировка
пытаться {
while(bufferList.isEmpty()) { // Буфер пуст
System.out.println("Ожидание потребителя, поток: " + Thread.currentThread().getName());
условие.ожидание();
}
// Потребление
ufferList.remove(0); // Удалить один из заголовка связанного списка
System.out.println("Потребительский потребительский, теперь размер буфера: "
+ufferList.size() + "и поток: " + Thread.currentThread().getName());
условие.сигналВсе();
} catch(InterruptedException e) {
е.printStackTrace();
} окончательно {
блокировка.разблокировка();
}
}
}