gpt4 book ai didi

Java线程切换

转载 作者:行者123 更新时间:2023-12-01 23:48:35 24 4
gpt4 key购买 nike

我有一个应该同时运行多个线程的程序。

这是纸牌游戏 Uno 的模拟,您应该为每个玩家都有一个线程。

现在有一个问题:只要玩家手中有一张与垃圾堆顶部的卡片数字和颜色相同的卡片,但还没有轮到该玩家,他就可以“切断”线路并将卡片放下。插队的玩家旁边的玩家继续。

我有一个玩家类:

class Player implements Runnable {

public boolean isHisTurn = false;

public Thread makeMove(final Card topCard, final boolean isHisTurn) {
Thread thread = new Thread(this);
thread.start();
return thread;
}
}

thread.start() 然后启动 run 方法,我在其中进行逻辑和决策。在 run() 开始时,线程随机 hibernate 300 - 700 毫秒,以便在这段时间内可以进行切割。

我的问题是,我应该将线程存储在某个地方吗?如果是,那么在哪里,以及当轮到不同的玩家时如何在线程之间切换?我知道它与 boolean isHisTurn 有关,我只是不知道如何使用它。

是的,这是家庭作业,但我只要求其中的一小部分,我不需要完整的答案,只是一些能插入我走向正确方向的东西。

最佳答案

and how can I switch between threads when it's a different player's turn?

线程的显着特征是多个线程可以同时运行。如果您不使用该功能,则使用线程就没有意义。由于玩家在未轮到他时也可以移动,因此所有玩家同时处于 Activity 状态实际上是有意义的。因此,我会为每个玩家创建(并启动)一个线程。该线程将在 sleep 和移动之间交替。

这就留下了线程如何交互的问题。为此,我将创建一个类,例如:

class Game {
Card topCard;
Player nextPlayer;

...
}

并将游戏实例提供给每个玩家线程。当游戏线程思考他的行动时,他可以查看最上面的牌,以及是否轮到他了。当他采取行动时,他只需更新游戏实例中的字段即可。

当然,由于不同的线程可以同时处于 Activity 状态,因此两个玩家可能会尝试同时移动(或者换句话说,一个玩家可能决定打一张牌,但另一个玩家速度更快,使得初始玩家的 Action 不再有效)。最简单的方法是通过同步对 Game 实例的访问来防止这种情况。为了真实起见,您可能会在查看游戏状态时尝试同步,然后思考,然后再次同步以采取行动。然而,在整个“看、思考和移动”周期中同步可能会更容易,因为这可以确保玩家不会干扰彼此的思维,并减少需要处理的极端情况的数量。

另一个问题是终止。一旦第一个玩家没有牌了,游戏就会结束,因此其他玩家需要一种方法来注意到这一事实。最简单的方法可能是最终玩家宣布自己为获胜者(例如,通过在 Game 实例中设置一个字段 WinningPlayer ),并让其他线程尽快终止宣布获胜者。

关于Java线程切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16632601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com