我使用的是同步方法,每秒调用60次。该方法检查ArrayList是否为空。即使它是空的,它也会进入if子句...
public synchronized void removeGameObjectsFromList()
{
if (!GAMEOBJECTSTOREMOVE.isEmpty())
{
for (int i = 0; i < GAMEOBJECTSTOREMOVE.size(); i++)
{
GameObject obj = GAMEOBJECTSTOREMOVE.get(i);
getRegionNodes().getChildren().remove(obj.getCurrentImageView());
GAMEOBJECTS.remove(obj.getNAME());
}
GAMEOBJECTSTOREMOVE.clear();
System.out.println("Finished");
}
System.out.println(GAMEOBJECTSTOREMOVE.isEmpty());
}
输出如下:
{true
Finished
true
Finished
true
true
Finished
true
true
Finished
true}
为什么它可以进入if()是否为空?
该方法在&#34; BulletManager&#34;它更新所有&#34;生活&#34;我认为子弹:
AnimationTimer timer = new AnimationTimer()
{
@Override
public void handle(long now)
{
if (!(BULLETS.isEmpty()))
{
for (int i = 0; i < BULLETS.size(); i++)
{
Bullet currentBullet = BULLETS.get(i);
if (currentBullet.getDistance() > 0)
{
currentBullet.move(currentBullet.getANGLE());
currentBullet.getCurrentImageView().setTranslateX(currentBullet.getCoordinate().getX());
currentBullet.getCurrentImageView().setTranslateY(currentBullet.getCoordinate().getY());
currentBullet.decrementDistance();
} else
{
GAMEMANAGER.addGameObjectToBeRemoved(currentBullet);
}
}
}
}
};
timer.start();
答案 0 :(得分:1)
这与线程安全无关,如上面的评论所示。看看这个简化的代码:
if (!GAMEOBJECTSTOREMOVE.isEmpty())
{
/* ... */
GAMEOBJECTSTOREMOVE.clear();
System.out.println("Finished");
}
System.out.println(GAMEOBJECTSTOREMOVE.isEmpty());
所以,如果它不是空的,你清除它的内容,使其为空,然后你打印它是空的。
如果它已经是空的,你只需打印它就是空的。
因此,您将始终在true
之后的第二个System.out.println
上打印clear
。
答案 1 :(得分:-1)
Okey我找到了一个解决方案...我只是愚蠢......太笨了......如果我创建了一个Bullet,那么对象就被添加到GameManager“GAMEOBJECTLIST”和BulletManager“BULLETLIST”......之后到达子弹的最大距离,它从GameManager列表中删除,但不是从BulletManager列表中删除......这是漏洞问题......现在一切正常......我很蠢