下面展示一些 内联代码片。
// An highlighted block
import java.util.concurrent.atomic.AtomicInteger;
/**
* 游戏战斗场景模拟 - 生产者消费者模型实现
* 核心:两位玩家都准备后,才开始战斗
*/
public class GameBattle {
// 共享资源:战斗准备计数器
private final Object lock = new Object(); // 共享锁对象
private final int totalPlayersRequired; // 需要准备的总玩家数(通常为2)
private AtomicInteger readyCount = new AtomicInteger(0); // 当前已准备的玩家数
public GameBattle(int totalPlayersRequired) {
this.totalPlayersRequired = totalPlayersRequired;
}
/**
* 玩家准备方法(生产者)
* @param playerName 玩家名称
* @throws InterruptedException
*/
public void playerReady(String playerName) throws InterruptedException {
synchronized (lock) {
// 1. 检查是否所有玩家已准备
while (readyCount.get() >= totalPlayersRequired) {
System.out.println("所有玩家已准备,战斗即将开始..." + playerName + " 请等待下一场。");
lock.wait(); // 战斗已就绪,后续玩家等待
}
// 2. 玩家准备
int currentReady = readyCount.incrementAndGet();
System.out.println("玩家 " + playerName + " 已准备。当前准备人数: " + currentReady + "/" + totalPlayersRequired);
// 3. 检查是否所有玩家都已准备
if (currentReady == totalPlayersRequired) {
System.out.println("\n所有玩家准备完毕!战斗开始!\n");
lock.notifyAll(); // 唤醒所有等待的消费者(战斗线程)
}
}
}
/**
* 等待并开始战斗方法(消费者)
* @throws InterruptedException
*/
public void startBattle() throws InterruptedException {
synchronized (lock) {
// 1. 检查是否满足开始条件
while (readyCount.get() < totalPlayersRequired) {
System.out.println("战斗线程等待: 玩家尚未准备就绪...");
lock.wait(); // 条件未满足,消费者等待
}
// 2. 战斗逻辑
System.out.println("战斗线程被唤醒,执行战斗逻辑...");
// 这里可以模拟战斗过程
Thread.sleep(1000); // 模拟战斗耗时
System.out.println("战斗结束!");
// 3. 重置状态,准备下一场战斗(可选)
readyCount.set(0);
System.out.println("系统已重置,准备下一场战斗。");
lock.notifyAll(); // 唤醒可能等待的生产者(玩家)
}
}
/**
* 测试主方法
*/
public static void main(String[] args) {
final GameBattle battle = new GameBattle(2); // 2名玩家
// 创建两个玩家线程
Thread player1 = new Thread(() -> {
try {
Thread.sleep(100); // 模拟网络延迟或玩家操作时间
battle.playerReady("玩家A");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
Thread player2 = new Thread(() -> {
try {
Thread.sleep(200); // 模拟玩家B准备稍慢
battle.playerReady("玩家B");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
// 创建战斗线程(消费者)
Thread battleThread = new Thread(() -> {
try {
battle.startBattle();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
// 启动线程
battleThread.start(); // 先启动战斗等待线程
player1.start();
player2.start();
// 等待所有线程结束
try {
player1.join();
player2.join();
battleThread.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
1048

被折叠的 条评论
为什么被折叠?



