java - 循环线程组 - 请帮我调试

标签 java multithreading for-loop

我努力寻找这段 Java 代码中的问题,但找不到 - 你能帮我吗?

我希望我提供的代码足够了,但如果有必要我会发布更多。

此外,我很抱歉,我没有举一个最小的例子。

game.getGroupPlayers().list();
MoverThread[] playerThread = game.getPlayers();
System.out.println(playerThread.length);
for (int i = 0; i < playerThread.length; i++) {
    try {
        System.out.println(i + " -> " +playerThread[i].toString());
        returnString += playerThread[i].toString() + "\n";
    } catch(NullPointerException e) {
        System.out.println("Problem at i = " + i);
        e.printStackTrace();
    }
    game.getGroupPlayers().list();
}

有时会给我以下输出:

java.lang.ThreadGroup[name=Players,maxpri=10]
Player-0: 113
Player-1: 277
Player-2: 0
3
0 -> Player-0: 113
1 -> Player-1: 277
Problem at i = 2
java.lang.NullPointerException
at Referee.goalFound(Referee.java:70)
at DebugTestReferee.goalFound(DebugTestReferee.java:42)
at Player.checkGoal(Player.java:61)
at Player.run(Player.java:94)
at java.lang.Thread.run(Thread.java:636)
java.lang.ThreadGroup[name=Players,maxpri=10]
Player-0: 113
Player-1: 277
Player-2: 0

[编辑] 这是 getPlayers() 的来源

/*
 * post returns the games players as an array
 */
public MoverThread[] getPlayers() {
synchronized(movers) {
    MoverThread[] playerList = new MoverThread[players.activeCount()];
    players.enumerate(playerList);
    return playerList;
}
}

[编辑] 这是玩家的生成方式

private ThreadGroup movers;
private ThreadGroup players;
private ThreadGroup ghosts;

private Observer observer;

/*
 * constructor
 */
 public Game(Maze maze, Referee referee) {
this.maze = maze;
this.referee = referee;
threadList = new ArrayList<MoverThread>();
movers = new ThreadGroup("Movers");
players = new ThreadGroup(movers, "Players");
ghosts = new ThreadGroup(movers, "Ghosts");
observer = null;
}

[编辑]

下面是我如何调用产生问题的方法:

/*
 * post checks if the players thread was interrupted - if not if hostfield pretends to be a goal the game gets stopped and referee is called to perform "goal-found-actions"
 */
private void checkGoal() {
if (!getThread().isInterrupted()) {
    synchronized(getGame().getMovers()) {
        if (!getThread().isInterrupted()) {
            if (getHostField().isGoal()) {
                Field goal = getHostField();
                getGame().getReferee().goalFound(this, goal);
                getGame().setGameOver();
            }
        }
    }
}
}

这是整个 goalFound()

/*
 * post action to be performed if a player finds a goal
 * print some information
*/
public void goalFound(Player player, Field at) {
//FIXME get the Bug!!!
String returnString = "Game over - player " + player.getName() + " found a goal on (" + at.getPos()[0] + ", "  + at.getPos()[1] + ")!\n";
game.getGroupPlayers().list();
MoverThread[] playerThread = game.getPlayers();
System.out.println(playerThread.length);
for (int i = 0; i < playerThread.length; i++) {
    try {
        System.out.println(i + " -> " +playerThread[i].toString());
        returnString += playerThread[i].toString() + "\n";
    } catch(NullPointerException e) {
        System.out.println("Problem at i = " + i);
        e.printStackTrace();
    }
}
game.getGroupPlayers().list();
returnString += game.mazeString();
System.out.println(returnString);
}

最佳答案

没有很好的方法来枚举 ThreadGroupThread。这是众所周知的糟糕设计。

在调用 ThreadGroup.activeCountThreadGroup.enumerate(Thread[]) 之间,线程可能已经启动或终止。您能做的最好的事情就是在分配数组时添加一个软糖因子 activeCount。如果返回值与数组长度匹配,那么您可能遗漏了一些并且应该使用更大的数组大小重复(可能是更大的一个因子,而不是仅仅添加一个常量)。成功后,您将需要适本地修剪您的阵列(或这样对待它)。

关于java - 循环线程组 - 请帮我调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652245/

相关文章:

java - 房间数据库架构更新

multithreading - Qt GUI 中许多小部件的快速更新

c# - 以下静态方法线程安全吗?

java - 嵌套 for 循环

javascript - Javascript 程序无法正常运行

r - 如何循环遍历数据框列表以在 R 中设置列​​名称?

java - SQL查询在java中使用arraylist创建arraylist

java - 是否可以从此 Java 方法中删除 "Class<T>"参数?

javascript - 使用 Ajax 将 var 发送到查询

c++ - 拆分引用计数如何在无锁堆栈中工作?