1.定义一个子弹池类
package countdownlatch;
public class BulletPool {
//总共的子弹数量
public static Integer maxBullet = 40000;
// 拿子弹方法,拿了多少子弹就减少多少
public Integer getBullet(Integer bulnum){
maxBullet=maxBullet-bulnum;
return bulnum;
}
}
2.定义一个弹匣类
package countdownlatch;
public class Magazine {
//表示一发弹匣能装多少子弹
public Integer bulnum = 40;
public void reduceBul(){
bulnum=bulnum-1;
}
}
3..业务抽象出来的补充弹药线程
package countdownlatch;
//业务抽象出来的补充弹药线程
public class SupplementBul implements Runnable{
MachineGun mg ;
public SupplementBul(MachineGun mg){
this.mg=mg;
}
//补充弹药方法
public void supplementBul(){
try {
MachineGun.latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mg) {
//开始补充弹药
for(int i = 0 ; i < mg.mgList.size();i++){
mg.mgList.get(i).bulnum=40;
}
//补充完弹药通知其他线程可以拿枪开始射击了
System.out.println("弹药补充完毕,开始射击!!!");
mg.notifyAll();
}
}
@Override
public void run() {
supplementBul();
}
}
4.定义一个枪类。,并开始射击
package countdownlatch;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
public class MachineGun extends Thread {
static CountDownLatch latch = new CountDownLatch(5);
//出门能带多少弹匣
public ArrayList<Magazine> mgList;
public MachineGun(ArrayList<Magazine> mgList){
this.mgList=mgList;
}
@Override
public void run() {
shot();
}
//射击方法
public void shot(){
while(true){
synchronized (this) {
if(this.mgList.size()>0){
//循环遍历弹匣
int i = 1;
for(Magazine mg : mgList){
//开始射击
for(int j = 0 ; j < 40;j++){
//System.out.println("第"+(i+1)+"个弹匣还剩"+mgList.get(i).bulnum+"个子弹");
mg.reduceBul();
}
//当前弹匣打完就扔掉
if(mg.bulnum==0){
System.out.println("打完第"+i+"个弹匣");
}
i++;
}
// 减少CountDownLatch中的等待数量
latch.countDown();
}else{
try {
this.wait();
System.out.println("子弹打完,准备上膛");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
//创建5个弹匣
ArrayList<Magazine> mgList = new ArrayList<Magazine>();
for( int i = 0 ; i < 5 ; i ++){
Magazine mg = new Magazine();
mgList.add(mg);
}
//加入到随身行李
MachineGun mg = new MachineGun(mgList);
//开始执行
mg.start();
SupplementBul sb = new SupplementBul(mg);
sb.run();
}
}