gpt4 book ai didi

java - 线程执行期间对象状态修改

转载 作者:行者123 更新时间:2023-12-01 10:03:53 25 4
gpt4 key购买 nike

我正在使用 javafx 开发一个小游戏(炸弹人)。基本上,我有可以放置炸弹的玩家。炸弹有持续时间(例如爆炸前 1500 毫秒)。

因此,当我的玩家放置炸弹时,我会使用 Thread.sleep(ms) 在炸弹中启动一个线程,并在我通知玩家炸弹爆炸后立即启动。

事实是,我的玩家可以放下炸弹然后移动...但是当炸弹爆炸时,它会通知玩家的实例以及放置炸弹时的坐标...

例如,如果我的玩家在[2;2],放置一个炸弹,然后移动到[2;4],然后炸弹爆炸,我的玩家回到[2;2]...

有人知道我怎样才能实现我的炸弹所指向的玩家实例......?

这是代码示例:

public class Player{
public void putBomb(){
listBomb.add(new Bomb(this));
}

public void refresh(){
System.out.println(xCoordinate+" "+yCoordinate);
}

}

public class Bomb{
public Bomb(Player p){
observer=p;

new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1500);
notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}

public void sendNotification(){
observer.refresh();
}

}

最佳答案

由于您的问题是 JavaFX 特定的,因此关于如何执行此操作的建议与非 GUI Java 程序不同(因为 JavaFX 具有内置并发辅助和单线程应用程序编程模型)。

你不需要另一个线程,你可以使用PauseTransition .

public class Bomb{
public Bomb(final Player player){
PauseTransition pause = new PauseTransition(Duration.seconds(1.5));
pause.setOnFinished(event -> player.refresh());
pause.play();
}
);

如果由于某种原因您不想使用转换并且想使用自己的线程,那么您应该使用 JavaFX concurrency utilitiesTask

如果您不想使用任务,那么您仍然可以创建自己的线程或可运行线程,但请确保使用 Platform.runLater() 进行任何回调。 。例如:

public class Bomb{
public Bomb(final Player player){
new Thread(() -> {
try {
Thread.sleep(1500);
Platform.runLater(() -> player.refresh());
} catch (InterruptedException e) {}
}
}).start();
}
}

在不同的方法中,我建议使用 PauseTransition 而不是其他方法,因为这样您就不需要处理线程等并发细节,这些细节很容易出错。

关于java - 线程执行期间对象状态修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604300/

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