采用多线程技术,例如wait/notify,设计实现一个符合生产者和消费者问题的程序,对某一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹,消费者线程是一个射出线程,它不断从枪膛中射出子弹。
public class 用waitnotify实现生产者消费者问题 {
public static final Integer MAX_SIZE = 20;
public static final Integer MIN_SIZE = 0;
private static class Gun{
private int BulletsNum;
synchronized void addBullets() {
try {
while (BulletsNum >= MAX_SIZE) {
System.err.println("弹匣已满,无法装弹");
wait();
}
BulletsNum ++;
System.out.println("弹匣未满,开始装弹,现有子弹:" + BulletsNum);
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized void shoot() {
try {
while (BulletsNum <= MIN_SIZE) {
System.err.println("弹匣已空,无法射击");
wait();
}
System.out.println("弹匣有弹,开始射击,现有子弹:" + BulletsNum);
BulletsNum --;
System.out.println("射击完还剩子弹:" + BulletsNum);
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static class addBullets implements Runnable{
public Gun gun;
public addBullets(Gun gun){
this.gun = gun;
}
@Override
public void run() {
while(true){
gun.addBullets();
}
}
}
private static class shoot implements Runnable{
public Gun gun;
public shoot(Gun gun){
this.gun = gun;
}
@Override
public void run() {
while(true){
gun.shoot();
}
}
}
public static void main(String[] args) {
Gun gun = new Gun();
Thread threadAddBullets = new Thread(new addBullets(gun));
threadAddBullets.start();
Thread threadShoot = new Thread(new shoot(gun));
threadShoot.start();
}
}