学习笔记-马士兵java- 生产者消费者问题、wait()与sleep()区别

1. wait() 与 sleep() 区别:

  ① wait 时,别的线程可以访问锁定对象

    调用 wait 方法的时候必须锁定该对象,否则报错。

  ② sleep 时,别的线程也不可以访问锁定对象。

2. 生产者消费者问题实例:
public class ProducerConsumer {
   public static void main(String[] args) {
      SyncStack ss = new SyncStack();
      Producer p = new Producer(ss);
      Consumer c = new Consumer(ss);
      new Thread(p).start();
      new Thread(p).start();
      new Thread(p).start();
      new Thread(c).start();
   }
}

class WoTou {
   int id;
   WoTou(int id) {
      this.id = id;
   }
   public String toString() {
      return "WoTou : " + id;
   }
}

class SyncStack {
   int index = 0;
   WoTou[] arrWT = new WoTou[6];
 
   public synchronized void push(WoTou wt) {
      while(index == arrWT.length) {
         try {
            this.wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      this.notifyAll();  
      arrWT[index] = wt;
      index ++;
   }
 
   public synchronized WoTou pop() {
      while(index == 0) {
         try {
            this.wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      this.notifyAll();
      index--;
      return arrWT[index];
   }
}

class Producer implements Runnable {
   SyncStack ss = null;
   Producer(SyncStack ss) {
      this.ss = ss;
   }
 
   public void run() {
      for(int i=0; i<20; i++) {
         WoTou wt = new WoTou(i);
         ss.push(wt);
       System.out.println("生产了:" + wt);
         try {
            Thread.sleep((int)(Math.random() * 200));
         } catch (InterruptedException e) {
            e.printStackTrace();
         }   
      }
   }
}

class Consumer implements Runnable {
   SyncStack ss = null;
   Consumer(SyncStack ss) {
      this.ss = ss;
   }
 
   public void run() {
      for(int i=0; i<20; i++) {
         WoTou wt = ss.pop();
       System.out.println("消费了: " + wt);
         try {
            Thread.sleep((int)(Math.random() * 1000));
         } catch (InterruptedException e) {
            e.printStackTrace();
         }   
      }
   }

posted @ 2013-10-29 22:24  被盗的小偷  阅读(277)  评论(0)    收藏  举报