有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java暂停/恢复线程中的任意计算

我正在制作一个编程游戏,玩家可以在其中编程他们盟友的行为。播放器为给定的ally编写decise()函数体,该函数体可以用任何java代码填充,但必须返回操作。我想给每一个盟友一组有限的计算量,所以1)增加更多的实体不会太慢游戏,2)一个实体花在计算上的时间会反映在游戏中,所以如果一个盟友花更多的时间“思考”,它的行动就会更少。我的灵感来自于Battlecode,它给每个单元一个固定数量的字节码,然后暂停计算,让程序员注意到事情发生了变化

我的问题是如何暂停和恢复正在线程中执行决策函数的实体。我知道这样做的“正确”方法是设置一个标志,告诉线程暂停,并让它偶尔检查一下,但由于我无法强制播放器在decise()函数中检查标志,因此我不确定如何暂停线程。实体只查看世界的固定表示形式,只需返回一个枚举值,所以我认为它们不应该对任何东西都有锁,但我希望有比使用不推荐的线程暂停方法更好的方法。我愿意改变玩家编写代码的方式,但我想不出一种方法,在仍然对用户隐藏暂停标志检查的同时,不让编写决策循环变得混乱和繁重。一定有办法做到这一点,因为战地代码做到了,但我在网上搜索如何做到的细节时不知所措


共 (2) 个答案

  1. # 1 楼答案

    如果要“暂停”当前线程,请使用java。util。同时发生的锁。锁支持可能会帮助你。如果您想暂停其他线程,我认为它不在java设计的范围内,您只能中断另一个线程,或者设置一个标志,而不是暂停

  2. # 2 楼答案

    你不能“暂停一个线程”,你也不能期望玩家遵守你的要求“玩得很好”并检查标志等。你可以中断另一个线程,但线程中运行的代码可以很容易地从中恢复。因此,您需要一种方法让控制线程保留控制权

    您可以:

    • 给游戏者线程一个返回动作的最长时间,如果它们没有及时返回,则执行一个“默认动作”
    • 记录他们花在计算上的时间,并经常给他们打电话,比如他们用的时间少等等

    大多数这类关注点都是由java.util.concurrent库提供的。退房:

    • ^{}
    • ^{}用于创建方便的ExecutorService实例
    • ^{}玩家将实现什么
    • ^{}用于获取结果,尤其是^{}用于限制线程必须返回结果的时间