自己ding下先
谁能给我讲清楚啊!~~~~~~~~~~~

解决方案 »

  1.   

    对的啊,是你程序的要求啊
    比如生产者:程序生产后就把available设置为true。就不能再生产。只能等到消费者消费了后才能再生产。
    比如消费者:程序消费后就把available设置为false。就不能再消费。只能等到生产者生产了后才能再消费。
    这样:生产-消费-生产-.......。就成了那样的结果。
      

  2.   

    但是输出不对啊
    Producer #1 put: 0
    Consumer #1 got: 0
    Consumer #1 got: 1
    应该先put啊
      

  3.   

    你下边的这段程序导致的:
        public synchronized int get() {
            while (available == false) {
                try {
                    wait();
                } catch (InterruptedException e) { }
            }
            available = false;
            notifyAll();
            return contents;
        }
    在操作available 时应该进入临界区
    synchronized 只能保证多个线程不能操作,但单个线程就不行了    synchronized(this) {
            while (available == false) {
                try {
                    wait();
                } catch (InterruptedException e) { }
            }
            available = false;
        }
      

  4.   

    我觉得是两个线程时差问题。不知道对不对
    Producer #1 put: 0
    Consumer #1 got: 0
    Consumer #1 got: 1
    当第一个Cosumer消费后,Producer生产了contents变为1。在Producer打印以前,Consumer线程
    进入临界区,进行操作。结束后Producer接着运行打印出contents。
      

  5.   

    package test;class Producer extends Thread {
        private CubbyHole cubbyhole;
        private int number;    public Producer(CubbyHole c, int number) {
            cubbyhole = c;
            this.number = number;
        }    public void run() {
            for (int i = 0; i < 10; i++) {
                cubbyhole.put(i);
                try {
                    sleep((int)(Math.random() * 100));
                } catch (InterruptedException e) { }
            }
        }
    } class CubbyHole {
        private int contents;
        private boolean available = false; public synchronized int get() {
            try {
             if(available == false)  wait();
            } catch (InterruptedException e) { }
            available = false;
            System.out.println("get: " + contents);
            notify();
            return contents;
        }    public synchronized void put(int value) {
            try {
             if(available == true) wait();
            } catch (InterruptedException e) { }
            contents = value;
            available = true;
            System.out.println("put: " + contents);
            notify();
        }
    }class Consumer extends Thread {
        private CubbyHole cubbyhole;
        private int number;    public Consumer(CubbyHole c, int number) {
            cubbyhole = c;
            this.number = number;
        }    public void run() {
            int value = 0;
            for (int i = 0; i < 10; i++) {
                value = cubbyhole.get();        }
        }
    }public class ProducerConsumerTest {
        public static void main(String[] args) {
            CubbyHole c = new CubbyHole();
            Producer p1 = new Producer(c, 1);
            Consumer c1 = new Consumer(c, 1);        p1.start();
            c1.start();
        }
    }我给你改了一下,看看这个
    put: 0
    get: 0
    put: 1
    get: 1
    put: 2
    get: 2
    put: 3
    get: 3
    put: 4
    get: 4
    put: 5
    get: 5
    put: 6
    get: 6
    put: 7
    get: 7
    put: 8
    get: 8
    put: 9
    get: 9
    就是打印的时候
    cubbyhole.put(i);
    *****
    System.out.println("Producer #" + this.number+ " put: " + i);

    value = cubbyhole.get();
    ******
    System.out.println("Consumer #" + this.number+ " got: " + value);
    这两个在*****的地方切换了进程