Java 如何创建每0.1秒运行一次的excecutable,并向其中传递一个数组

Java 如何创建每0.1秒运行一次的excecutable,并向其中传递一个数组,java,scheduledexecutorservice,Java,Scheduledexecutorservice,我在做游戏。 我创建了一个包含所有形状的数组。 我需要每0.1秒移动一次形状或一些小的东西。 同时我也有一个圆圈跟着我的鼠标。 我需要能够移动圆圈跟随我的鼠标所有的时间,但我还没有找到一种方法来移动其他圆圈一点点每秒。 当我尝试移动其他圆圈时,它们都会在javaFX窗口加载之前立即移动 这是我的阵列 ArrayList<Shape> Objects = new ArrayList<Shape>(); Circle I = ClassObjects.getCircle(r

我在做游戏。 我创建了一个包含所有形状的数组。 我需要每0.1秒移动一次形状或一些小的东西。 同时我也有一个圆圈跟着我的鼠标。 我需要能够移动圆圈跟随我的鼠标所有的时间,但我还没有找到一种方法来移动其他圆圈一点点每秒。 当我尝试移动其他圆圈时,它们都会在javaFX窗口加载之前立即移动

这是我的阵列

ArrayList<Shape> Objects = new ArrayList<Shape>();

Circle I = ClassObjects.getCircle(randomWidth,randomX,randomY);    
Objects.add(I);
我创建一个圆并将其添加到我的形状数组中

ArrayList<Shape> Objects = new ArrayList<Shape>();

Circle I = ClassObjects.getCircle(randomWidth,randomX,randomY);    
Objects.add(I);
但我发现这是一个可运行的executor服务,因此无法传递任何返回值,也无法传递数组

我试着研究callable executor服务,但我不明白如何编写代码

如果有人能给我一个每0.1秒运行一次的可执行文件的示例,并且可以将我的形状数组列表传递给它,这样它就可以被修改,然后返回


非常感谢。

使用
TimerTask
是可能的。扩展
TimerTask
如:

class CustomTimerTask extends TimerTask  {
    List<Shape> shapes;

    public CustomTimerTask(List<Shape> shapes, /* observers*/) {
       this.shapes = shapes;
    }

    @Override
    public void run() {
       // update shapes
       // notify( about mouse events or whatever)
    }
}
有关示例,请参见Oracle教程中的使用

否则,您可以使用

您不需要将数组传递给Timeline或AnimationTimer,因为节点将存储在场景图中,您可以直接从Timeline或AnimationTimer事件处理代码中操纵场景图节点

例如,要创建每0.1秒处理一次的时间线:

final Timeline timeline = new Timeline();
timeline.setCycleCount(Animation.INDEFINITE);
timeline.getKeyFrames().add(
   new KeyFrame(Duration.millis(100)),
   new KeyValue(node.translateXProperty(), 25))
);
timeline.play();
请注意,JavaFX中的帧速率默认为每秒60帧。因此.1秒的时间线不会精确地调用每个.1秒

还涉及:


在计时器任务中,您正在为字符串对象分配形状列表。为此,您应该创建一个JavaFX动画。不能直接从UI线程以外的线程修改UI元素,尝试为动画安排任务的开销太大,并且没有足够的确定性来顺利运行。这不是答案,但我很愚蠢,我应该使用变换来移动我的圆,而不是我尝试通过更改数组中的圆来直接更改x和y。无论如何,谢谢你,因为这正是促使我更多关注javaFX的原因。
final Timeline timeline = new Timeline();
timeline.setCycleCount(Animation.INDEFINITE);
timeline.getKeyFrames().add(
   new KeyFrame(Duration.millis(100)),
   new KeyValue(node.translateXProperty(), 25))
);
timeline.play();