CountDownLatch并发编程

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();
         
    }
}
 

猜你喜欢

转载自blog.csdn.net/dzh145/article/details/89600441