/**
* 灰烬之灵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();
}
}