【发布时间】:2017-02-28 02:13:15
【问题描述】:
我需要一些关于 java 线程的帮助。
我目前正在做一个项目,在运行时编译一个类并调用它的主要方法。该类代表一个区域中的一个人,它作为画布对用户可见。 这个 main 方法调用了一些其他方法。用户在编辑器中键入的方法或超类中的预定义方法。 编辑器内容可能如下所示:
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 定义在一个超类中,而 takeAll 是用户在运行时定义的方法。 我的程序添加类前缀并编译用户类。
用户应该能够通过单击 GUI 中的一些按钮来启动、暂停、恢复和终止主方法。
当我只运行 main 方法时,所有方法都完成得太快了。用户只会看到结果,看不到步骤,并且在运行时无法进行交互。
到目前为止,我创建了一个新的可运行对象并启动了一个线程。
protagonistMainMethodRunnable = new Runnable() {
@Override
public void run() {
protagonist.main();
terminateWasPressed();
}
};
//.....
Thread thread = new Thread(protagonistMainMethodRunnable);
thread.run();
“主角”是用户类的一个实例,在运行时编译。
我不太擅长线程,也找不到在每次方法调用后创建延迟的想法。
是否有人想在 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 方法。通过这种方式,您可以在运行时更改延迟(例如使用滑块)。
【问题讨论】:
-
你使用的是什么 GUI 库?
-
@HovercraftFullOfEels 我使用 JavaFX 作为 GUI
-
@ScaryWombat 如何在每个方法之后调用 sleep 方法?用户不必在每次调用后将其插入到他的类中。
-
@JWo 抱歉您的问题不清楚
-
你用什么来动态编译你的代码?
标签: java multithreading javafx