Моделирование классической проблемы производитель-потребитель. Эта программа моделирует простейший случай — одинарную буферизацию. Чтобы имитировать реальную ситуацию, добавляется задержка при потреблении и производстве товара. Вы можете моделировать различные скорости генерации и потребления, изменяя задержку.
[код]
[/ко/**
* проблема потребителя-производителя с одним буфером.
* автор Сюй([email protected]).
* */
общественный класс ConsumerProducer {
статический буфер объекта = ноль;
статический мьютекс объекта = новый объект();
статический объект condConsumer = новый объект();
статический объект condProducer = новый объект();
public static void main(String[] args) {
Производитель потока = новый поток() {
общественный недействительный запуск () {
//for(int i=0; i<10; i++) {
for(int i=0; ; i++) {
// производим элемент.
пытаться {
Thread.sleep(1000);
} catch (InterruptedException e) {
е.printStackTrace();
}
String item = new String("item-" + i);
System.out.println("[продюсер] произвел " + элемент);
// ждем, пока буфер опустеет.
синхронизировано (condProducer) {
в то время как (буфер! = ноль) {
пытаться {
condProducer.wait();
} catch (InterruptedException e) {
е.printStackTrace();
}
}
}
// помещаем элемент в буфер.
синхронизированный (мьютекс) {
буфер = элемент;
System.out.println("[продюсер] поместил " + элемент + " в буфер.");
}
// уведомляем потребителей.
синхронизированный (condConsumer) {
condConsumer.notify();
}
}
}
};
Потребитель потока = новый поток() {
общественный недействительный запуск () {
//for(int i=0; i<10; i++) {
для( ; ; ) {
// ждем прихода товара.
синхронизированный (condConsumer) {
в то время как (буфер == ноль) {
пытаться {
condConsumer.wait();
} catch (InterruptedException e) {
е.printStackTrace();
}
}
}
// получаем элемент из буфера.
Строковый элемент = ноль;
синхронизированный (мьютекс) {
элемент = (Строка)буфер;
буфер = ноль;
System.out.println(" [потребитель] получает " + элемент + " из буфера.");
}
// потребляем предмет.
пытаться {
Thread.sleep(500);
} catch (InterruptedException e) {
е.printStackTrace();
}
System.out.println(" [потребитель] использован " + элемент);
// уведомляем производителей.
синхронизировано (condProducer) {
condProducer.notify();
}
}
}
};
потребитель.start();
производитель.start();
}
}де]