采用JAVA多线程技术,设计实现一个符合生产者和消费者问题的程序:对一个枪膛进行操作,其最大容量是12颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹。
public class ShengChanZheXiaoFeiZhe {
public static void main(String[] args) {
Container c = new Container();
BulletProducer producer = new BulletProducer(c);
BulletConcumer consumer = new BulletConcumer(c);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(consumer);
t1.start();
t2.start();
}
}
//子弹类,id为序号
class Bullet{
int id;
Bullet(int id){
this.id = id;
}
//重写toString方法,便于显示子弹序号。
@Override
public String toString() {
return "第"+id+"个子弹";
}
}
//装子弹的容器,具备一定空间,含有装子弹和发子弹的同步方法(是一个栈),方法需要判断栈的空和满,并使用等待唤醒机制控制。
class Container{
Bullet[] arr = new Bullet[12];
int index = 0;
public synchronized void push(Bullet bullet){
while(index==arr.length){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
arr[index] = bullet;
index++;
}
public synchronized Bullet pop(){
while(index==0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify();
index--;
return arr[index];
}
}
//生产者,需要被一个线程执行故实现runnable接口,run方法中初始化子弹容器,不断建立子弹对象并向容器中push,并输出子弹序号。
class BulletProducer implements Runnable{
Container c = null;
public BulletProducer(Container c) {
this.c = c;
}
public void run(){
int i = 0;
while(true){
Bullet bullet = new Bullet(++i);
c.push(bullet);
System.out.println("上膛"+bullet);
}
}
}
//消费者,也实现了runnable,建立容器,不断从容器中pop子弹,并输出子弹序号。
class BulletConcumer implements Runnable{
Container c = null;
public BulletConcumer(Container c) {
this.c = c;
}
public void run(){
while(true){
Bullet bullet = c.pop();
System.out.println("->->->->->->发射"+bullet);
}
}
}