面试题:
采用多线程技术,例如wait/notify,设计实现一个符合生产者和消费者问题的程序,对某一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹,消费者线程是一个射出线程,它不断从枪膛中射出子弹。
package com.cz.mhm.gun;
public abstract class AbstractGun {
/**
* 枪装弹
*/
abstract void zhuangdan();
/**
* 枪射击
*/
abstract void sheji();
}
package com.cz.mhm.gun;
public class Gun extends AbstractGun {
/**
* 枪内可存放20颗子弹
*/
int magazine = 0;
@Override
synchronized void zhuangdan() {
try {
while (magazine >= 20) {
System.out.println("弹匣已满,无法装弹");
wait();
}
magazine ++;
System.out.println("弹匣未满,开始装弹,现有子弹:" + magazine);
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
synchronized void sheji() {
try {
while (magazine <= 0) {
System.out.println("弹匣已空,无法射击");
wait();
}
System.out.println("弹匣有弹,开始射击,现有子弹:" + magazine);
magazine --;
System.out.println("射击完还剩子弹:" + magazine);
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.cz.mhm.gun;
import java.util.concurrent.TimeUnit;
/**
* 装弹类
*/
public class ZhuangDan implements Runnable {
public Gun gun;
public ZhuangDan(Gun gun) {
this.gun = gun;
}
@Override
public void run() {
while (true) {
gun.zhuangdan();
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.cz.mhm.gun;
import java.util.concurrent.TimeUnit;
/**
* 射击类
*/
public class Sheji implements Runnable {
public Gun gun;
public Sheji(Gun gun) {
this.gun = gun;
}
@Override
public void run() {
while (true) {
gun.sheji();
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.cz.mhm.gun;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
Gun gun = new Gun();
Thread threadZhuangdan = new Thread(new ZhuangDan(gun));
threadZhuangdan.start();
Thread threadSheji = new Thread(new Sheji(gun));
threadSheji.start();
}
}