下面的程序简单模拟了生产者和消费者的关系:生产者依次生产了从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();
}
}
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();
}
}
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();
}
}