您的位置:首页 > 编程语言 > Java开发

java解决单缓冲生产者消费者问题示例

2014-04-27 11:59 816 查看

经典的生产者消费者问题模拟。此程序模拟最简单情形――单缓冲。为模拟实际情况,consume item和produce item时加了延时,可以通过修改延时模拟不同的生成消费速率。

[code]

[/co/**
 * 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();
 }
}de]

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息