gpt4 book ai didi

Java:控制线程速度/线程的更改延迟

转载 作者:行者123 更新时间:2023-11-30 06:52:22 25 4
gpt4 key购买 nike

我需要一些有关 java 线程的帮助。

我目前正在开发一个项目,该项目在运行时编译一个类并调用它的 main 方法。该类代表某个区域中的一个人,该区域对于用户来说是可见的 Canvas 。该 main 方法调用一些其他方法。用户在编辑器中键入的方法或来自父类(super class)的预定义方法。编辑器内容可能如下所示:

main() {
System.out.println("test users class main");
takeAll();
takeAll();
}

public void takeAll() {
for (int i = 0; i < 2; i++)
move();
takeHoney();
takeHoney();
takeHoney();
for (int i = 0; i < 2; i++)
move();
}

上面的代码是用户稍后在GUI内的编辑器中输入的内容,当他使用某个按钮时将编译该代码。他应该学习命令式编程。

方法 main、move 和 takeHoney 是在父类(super class)中定义的,而 takeAll 是用户在运行时定义的方法。我的程序添加了类前缀并编译了用户类。

用户应该能够通过单击 GUI 中的某些按钮来启动、暂停、恢复和终止 main 方法。

当我刚刚运行主方法时,所有方法都完成得太快了。用户只能看到结果,而看不到步骤,并且在运行时无法进行交互。

到目前为止,我创建了一个新的可运行对象并启动了一个线程。

protagonistMainMethodRunnable = new Runnable() {
@Override
public void run() {
protagonist.main();
terminateWasPressed();
}
};
//.....
Thread thread = new Thread(protagonistMainMethodRunnable);
thread.run();

“protagonist”是 users 类的一个实例,它是在运行时编译的。

我不太擅长线程,也找不到在每次方法调用后创建延迟的想法。

有人有想法在 main 中的每个方法调用之后甚至在每个方法调用之后创建延迟吗?

编辑:James_D 的想法非常有帮助。这是适合我的用例的类:

public class OperationQueue {

private Queue<Runnable> operationQueue = new LinkedList<Runnable>();
private Timeline timeline;

public OperationQueue(double delay) {
timeline = null;
setDelay(delay);
}

public void setDelay(double seconds) { //careful: seconds > 0
if (timeline != null)
timeline.stop();
System.out.println("Set keyframe duration to " + seconds + " seconds.");
timeline = new Timeline(new KeyFrame(Duration.seconds(seconds), e -> {
if (!operationQueue.isEmpty()) {
operationQueue.remove().run();
}
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}

public Queue<Runnable> getOperationQueue() {
return operationQueue;
}

public void add(Runnable queueItem) {
this.operationQueue.add(queueItem);
}
public void clearQueue() {
this.operationQueue.clear();
}
}

我将时间线移至 setter 方法。通过这种方式,您可以在运行时更改延迟(例如使用 slider )。

最佳答案

这只是我如何解决这个问题的概述,因为这个问题确实太宽泛了。

您实际上是在问如何执行用户在代码中定义的动画。 (这是一个动画,因为您正在显示帧的集合,其中每个帧都是通过执行操作来定义的,并且操作之间存在时间间隔。)

考虑创建一个要执行的操作队列:

private class UI {

private Queue<Runnable> operationQueue = new LinkedList<Runnable>();

public Queue<Runnable> getOperationQueue() {
return operationQueue();
}

// ...
}

现在,您可以通过时间轴运行动画,该时间轴定期检查队列,如果其中有内容,则执行该操作:

public UI () {

// set up ui, etc...

Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), e-> {
if (! operationQueue.isEmpty()) {
operationQueue.remove().run();
}
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}

现在将预定义的基本方法设为私有(private),并定义将这些私有(private)方法提交到队列的公共(public)方法:

public class BaseClass {

private final UI ui = ... ;

private void doMove() {
// implementation here...
}

public void move() {
ui.getOperationQueue().add(this::doMove);
}

private void doTakeHoney() {
// implementation here...
}

public void takeHoney() {
ui.getOperationQueue().add(this::doTakeHoney);
}
}

请注意,这里实际上根本没有线程。一切都在 FX 应用程序线程上;时间由时间轴控制。

关于Java:控制线程速度/线程的更改延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42498957/

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