下面的程序简单模拟了生产者和消费者的关系:生产者依次生产了从A-Z的共享数据,而消费者则不断地消费生产者生产的A-Z的共享数据。在这一对关系中,必须先有生产者生产,才能有消费者消费。生产者每生产一个,就通知消费者消费一个;消费者每消费一个,就通知生产者生产一个。即:1、在生产者没有生产之前,通知消费者等待;在生产者生产之后,马上通知消费者消费。2、在消费者消费了之后,通知生产者已经消费完,需要生产。现用ShareData类模拟共享数据,Producer类模拟生产者,Consumer类模拟消费者,Test类用于测试。请根据Consumer类和Test类,完成ShareData类和Producer类。class Consumer extends Thread {
    private ShareData s;
    Consumer(ShareData s) {
        this.s = s;
    }
    public void run() {
        char ch;
        do {
            try {
                Thread.sleep((int) Math.random() * 400);
            } catch (InterruptedException e) {
            }
            ch = s.getShareChar();
        } while (ch != 'Z');
    }
}public class Test {
    public static void main(String argv[]) {
        ShareData s = new ShareData();
        new Consumer(s).start();
        new Producer(s).start();
    }
}

解决方案 »

  1.   


    public class ShareData {
    private char c;

    public synchronized char getShareChar() {
    char returnC = 0;
    try {
    if(c == 0)
    wait();
    returnC = c;
    c = 0;
    notifyAll();
    }
    catch(InterruptedException e) {
    e.printStackTrace();
    }
    finally {
    System.out.println("Customer get char " + returnC);
    return returnC;
    }
    }

    public synchronized void setShareChar(char c) {
    try {
    if(this.c != 0)
    wait();
    this.c = c;
    System.out.println("Producer produce char " + this.c);
    notifyAll();
    }
    catch(InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    public class Producer extends Thread {
    private ShareData s;
        
    Producer(ShareData s) {
    this.s = s;
    }

    public void run() {
    char ch = 'A';
    do {
    try {
    Thread.sleep((int) Math.random() * 400);
    }
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    s.setShareChar(ch);
    ch++;
    } while (ch != 'Z' + 1);
    }
    }
    class Consumer extends Thread {
    private ShareData s;
        
    Consumer(ShareData s) {
    this.s = s;
    }

    public void run() {
    char ch;
    do {
    try {
    Thread.sleep((int) Math.random() * 400);
    }
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    ch = s.getShareChar();
    } while (ch != 'Z');
    }
    }
    public class Test {
    public static void main(String args[]) {
    ShareData s = new ShareData();
    new Consumer(s).start();
    new Producer(s).start();
        }
    }