【问题标题】:turns based on threads lead to unexpected deadlock基于线程的轮次导致意外死锁
【发布时间】:2022-01-15 16:31:53
【问题描述】:

程序是一个简单的井字游戏(游戏逻辑已经过测试) 我应该让每个玩家都有自己的线程,但我不知道为什么我的情况会陷入僵局

每个玩家都有一个名为 myTurn 的布尔值,由静态游戏管理器对象控制 运行方法如下

    public void run()
{
    
    while(true)
    {
        if(myTurn )
        {
            playTurn();
            Game.g.switchTurn();
        }
    }
    
}

我的playTurn方法如下:

    private synchronized void playTurn()
{
    
    System.out.println(board);
    getTurn();
    
    board.incTurnCount();
    Game.g.checkGameEnd(type);
    
    
    
}

最后是开关转法

public void switchTurn()
{
    p1.setMyTurn(!p1.isMyTurn()); 
    p2.setMyTurn(!p2.isMyTurn()); 
}

主要方法

public class Game {

public static GameLogicHandler g;
public static void main(String[] args) {
    MenusHandler m = new MenusHandler();
    Board b = new Board(3);
    HumanPlayer p1 = new HumanPlayer("a", true, b);
    HumanPlayer p2 = new HumanPlayer("b", false, b);
    g = new GameLogicHandler(p1, p2, b);
    
    p1.start();
    p2.start();
    System.out.println(b);
    
    

}

}

Game.g 有一个 p1 和 p2 的实例,在调试时它们确实会发生变化并在运行时工作,但我会陷入死锁

这个想法是,游戏对象在每个回合都会改变两个玩家的回合状态,使他们能够进入关于自己回合的 if 条件。 p1s myTurn 启动为 true

【问题讨论】:

    标签: multithreading tic-tac-toe turn


    【解决方案1】:

    我的问题是没有将部分放在我的 run 方法中的同步块中。新代码(有效)看起来像这样

    public void run()
    {
        
        while(true)
        {
            synchronized (board) {
                if(myTurn && !board.isGameFinished() )
                {
                    playTurn();
                    Game.g.switchTurn();
                }
            }
            
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多