本帖最后由 c2c9ccc 于 2014-03-06 16:31:47 编辑

解决方案 »

  1.   

    barsket.wait(); 只有这一行,当前线程才会释放 barsket 的同步锁(synchronized(barsket){})。
      

  2.   

    barsket.wait(); 是要等待另外一个线程完全操作完了才会执行的···
      

  3.   

    一个sleep让那个 生产者sleep长点,可以吗?
      

  4.   

    lass Message {
    private int bao = 0;
    private static final int temp = 7; public synchronized void setMessage() {
    if (this.bao > temp) {
    try {
    System.out.println("篮子装满包了");
    super.wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    this.bao++;
    if(this.bao==1){super.notify();}
    System.out.println(Thread.currentThread().getName() + ": 生产了一个包");
    } public synchronized void getMessage() {
    if (bao <= 0) {
    try {
    System.out.println("篮子里没有包了");
    super.wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    this.bao--;
    if(this.bao==6){super.notify();}
    System.out.println(Thread.currentThread().getName() + "吃掉一个包,还剩:"
    + this.bao);
    }
    }class Producer implements Runnable {
    private Message mes; public Producer() {
    } public Producer(Message mes) {
    this.mes = mes;
    } public void run() {
    for (int i = 0; i < 20; i++) {
    if (i % 2 == 0) {
    mes.setMessage();
    } else {
    mes.setMessage();
    }
    }
    }
    }class Consumer implements Runnable {
    private Message mes; public Consumer() {
    } public Consumer(Message mes) {
    this.mes = mes;
    } @Override
    public void run() {
    // TODO 自动生成的方法存根
    for (int i = 0; i < 20; i++) {
    mes.getMessage();
    }
    }
    }public class TestProduceConsumer { public static void main(String[] args) {
    // TODO 自动生成的方法存根
    Message mes = new Message();
    Producer pro = new Producer(mes);
    Consumer com = new Consumer(mes);
    new Thread(pro, "A").start();
    new Thread(pro, "B").start();
    new Thread(com, "a").start();
    new Thread(com, "b").start();
    }}
    输出-----------------------------------------------
    B: 生产了一个包
    B: 生产了一个包
    B: 生产了一个包
    B: 生产了一个包
    B: 生产了一个包
    B: 生产了一个包
    B: 生产了一个包
    B: 生产了一个包
    篮子装满包了
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    B: 生产了一个包
    B: 生产了一个包
    篮子装满包了
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    B: 生产了一个包
    B: 生产了一个包
    篮子装满包了
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    B: 生产了一个包
    B: 生产了一个包
    篮子装满包了
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    B: 生产了一个包
    B: 生产了一个包
    篮子装满包了
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    B: 生产了一个包
    B: 生产了一个包
    篮子装满包了
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    B: 生产了一个包
    B: 生产了一个包
    b吃掉一个包,还剩:7
    b吃掉一个包,还剩:6
    b吃掉一个包,还剩:5
    b吃掉一个包,还剩:4
    b吃掉一个包,还剩:3
    b吃掉一个包,还剩:2
    b吃掉一个包,还剩:1
    b吃掉一个包,还剩:0
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    篮子装满包了
    a吃掉一个包,还剩:7
    a吃掉一个包,还剩:6
    a吃掉一个包,还剩:5
    a吃掉一个包,还剩:4
    a吃掉一个包,还剩:3
    a吃掉一个包,还剩:2
    a吃掉一个包,还剩:1
    a吃掉一个包,还剩:0
    篮子里没有包了
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    篮子装满包了
    a吃掉一个包,还剩:7
    a吃掉一个包,还剩:6
    a吃掉一个包,还剩:5
    a吃掉一个包,还剩:4
    a吃掉一个包,还剩:3
    a吃掉一个包,还剩:2
    a吃掉一个包,还剩:1
    a吃掉一个包,还剩:0
    篮子里没有包了
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    A: 生产了一个包
    a吃掉一个包,还剩:3
    a吃掉一个包,还剩:2
    a吃掉一个包,还剩:1
    a吃掉一个包,还剩:0
    刚学java,不知道对不对,求鉴定!