[初级]生产者消费者问题

 


 

 

 

 

/**
 * 灰烬之灵EM(同一场景、同一资源)
 */
public class EM {
	/**
	 * 最大充能数量
	 */
	private final int MAX_F_COUNT = 3;
	/**
	 * 火之余烬F 充能个数
	 */
	private int count;
	/**
	 * 火之余烬 个数是否已满
	 */
	private boolean isFull(){
		return count >= MAX_F_COUNT;
	}
	/**
	 * 火之余烬 个数是否不为0
	 */
	private boolean isHas(){
		return count > 0;
	}
	/**
	 * 放技能
	 */
	public synchronized void skillRelease(){
		if(!isHas()){
			try {
				System.out.println("技能CD,不能释放技能");
				this.wait();//玩家等待技能CD(此处放在Player类中可能更恰当)
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(100);//技能前摇^_^
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		count--;
		System.out.println("-释放1个火之灰烬[剩余:"+count+"]");
		this.notify();
	}
	/**
	 * 技能CD
	 */
	public synchronized void skillCD(){
		if(isFull()){
			try {
				System.out.println("能量充满");
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		count++;
		System.out.println("+完成1个火之灰烬充能[剩余:"+count+"]");
		this.notify();
	}
}

 

 

 

/**
 * 生产者(完成技能CD)
 */
public class War3 implements Runnable{
	private EM em;
	public War3(EM em){
		this.em = em;
	}
	@Override
	public void run() {
		while(true){
			em.skillCD();
		}
	}
}

 

 

 

/**
 * 消费者(玩家放技能)
 */
public class Player implements Runnable{
	private EM em;
	public Player(EM em){
		this.em = em;
	}
	@Override
	public void run() {
		for(int i=0;i<20;i++){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			em.skillRelease();
		}
	}
}

 

 

代码调用:

 

/**
 * 生产者消费者问题
 * 	同一场景,同一资源
 * 
 * DOTA1 灰烬之灵(火猫)的 火之余烬(大招) 技能
 * 
 * 生产者:war3,当技能个数不足3时,则会技能技能CD,产生 火之余烬 技能
 * 消费者:玩家,当技能格数不为0时,可以发动技能
 * 同一场景:英雄 火猫
 * 同一资源:技能 火之余烬
 */
public class Client {
	public static void main(String[] args) throws InterruptedException {
		EM em = new EM();
		War3 war3 = new War3(em);
		Player p = new Player(em);
		
		new Thread(war3).start();
		Thread.sleep(2000);//学完大招后等待充能
		new Thread(p).start();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值