经典的生产者消费者问题模拟。此程序模拟最简单情形——单缓冲。为模拟实际情况,consume item和produce item时加了延时,可以通过修改延时模拟不同的生成消费速率。
- /**
- * single buffer consumer-producer problem.
- * by xu(xusiwei1236@163.com).
- * */
- public class ConsumerProducer {
- static Object buffer = null;
- static Object mutex = new Object();
- static Object condConsumer = new Object();
- static Object condProducer = new Object();
- public static void main(String[] args) {
- Thread producer = new Thread() {
- public void run() {
- // for(int i=0; i<10; i++) {
- for(int i=0; ; i++) {
- // produce item.
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- String item = new String("item-" + i);
- System.out.println("[producer] produced " + item);
- // wait for buffer empty.
- synchronized (condProducer) {
- while(buffer != null) {
- try {
- condProducer.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- // put item to buffer.
- synchronized (mutex) {
- buffer = item;
- System.out.println("[producer] put " + item + " to buffer.");
- }
- // notify consumers.
- synchronized (condConsumer) {
- condConsumer.notify();
- }
- }
- }
- };
- Thread consumer = new Thread() {
- public void run() {
- // for(int i=0; i<10; i++) {
- for( ; ; ) {
- // wait for item come.
- synchronized (condConsumer) {
- while( buffer == null ) {
- try {
- condConsumer.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- // get item from buffer.
- String item = null;
- synchronized (mutex) {
- item = (String)buffer;
- buffer = null;
- System.out.println(" [consumer] get " + item + " from buffer.");
- }
- // consume item.
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(" [consumer] comsumed " + item);
- // notify producers.
- synchronized (condProducer) {
- condProducer.notify();
- }
- }
- }
- };
- consumer.start();
- producer.start();
- }
- }