题目要求:
生产者每隔100ms产生0-9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来。只要这个MyNumber对象中保存了新的数字,消费者就将其取出并显示。试定义MyNumber类,编写消费者和生产者程序,并编写主程序创建一个MyNumber对象,以及一个生产者线程、一个消费者线程,并将这两个线程启动运行。
MyNumber.java:
package ProducerAndConsumer;
import java.util.Vector;
public class MyNumber {
//创建一个栈,后进先出
Vector<Integer> vector=new Vector<Integer>();
public synchronized Integer pop(){
Integer reInt = null;
while(vector.size()==0){
try{
this.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
reInt=vector.remove(vector.size()-1);
return reInt;
}
public synchronized void push(int num){
this.notify();
Integer number=new Integer(num);
vector.addElement(number);
}
}
Producer.java:
package ProducerAndConsumer;
import java.util.Random;
public class Producer extends Thread{
private MyNumber myNumber;
private int num=0;
private static int counter=1;
public Producer(MyNumber number){
this.myNumber=number;
num=counter++;
}
@Override
public void run() {
for(int i=0;i<100;i++){
int figure=new Random().nextInt(10);
myNumber.push(figure);
System.out.println("Producter "+num+":"+figure);
try{
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Consumer.java:
package ProducerAndConsumer;
public class Consumer extends Thread{
private MyNumber myNumber;
private int num=0;
private static int counter=1;
public Consumer(MyNumber number){
this.myNumber=number;
num=counter++;
}
@Override
public void run() {
for(int i=0;i<100;i++){
int figure=myNumber.pop();
System.out.println("Consumer "+num+":"+figure);
try{
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类:
package ProducerAndConsumer;
public class Test {
public static void main(String[] args) {
MyNumber myNumber=new MyNumber();
Thread pt1=new Thread(new Producer(myNumber));
Thread pt2=new Thread(new Producer(myNumber));
Thread ct1=new Thread(new Consumer(myNumber));
Thread ct2=new Thread(new Consumer(myNumber));
pt1.start();
pt2.start();
ct1.start();
ct2.start();
}
}
某一次的运行结果:
Consumer 1:7
Producter 2:5
Producter 1:7
Consumer 2:5
Producter 2:9
Producter 1:0
Consumer 1:0
Consumer 2:9
…