采用多线程技术,设计实现一个符合生产者和消费者问题的程序,对某一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹,消费者线程是一个射出线程,它不断从枪膛中射出子弹。
public class GunGame {
//定义一个抢夹子
int maxBullet;
//剩余的子弹
int surplusBullet;
public GunGame(Integer maxBullet) {
this.maxBullet = maxBullet;
}
//生产者,压入子弹
public synchronized void product() {
while (surplusBullet >= maxBullet) {
//子弹充足
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生产子弹
surplusBullet++;
System.out.println(Thread.currentThread().getName() + "装入子弹以后,当前剩余" + surplusBullet);
notifyAll();
}
//消费者,射出子弹
public synchronized void consume() {
while (surplusBullet <= 0) {
//没子弹了 休息一下
try {
System.out.println("没子弹了,等待制造子弹");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//射出子弹
surplusBullet--;
System.out.println(Thread.currentThread().getName() + "射出子弹:当前剩余" + surplusBullet);
notifyAll();
}
static class Products implements Runnable {
GunGame gunGame;
public Products(GunGame gunGame) {
this.gunGame = gunGame;
}
@Override
public void run() {
while (true) {
gunGame.product();
}
}
}
static class Consumes implements Runnable {
GunGame gunGame;
public Consumes(GunGame gunGame) {
this.gunGame = gunGame;
}
@Override
public void run() {
while (true) {
gunGame.consume();
}
}
}
public static void main(String[] args) {
GunGame test = new GunGame(20);
Products products = new Products(test);
Consumes consumes = new Consumes(test);
new Thread(consumes).start();
new Thread(products).start();
}
}