采用多线程技术,例如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 ( ) ;
}
}