- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一些有关 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/
我是一名优秀的程序员,十分优秀!