【发布时间】:2020-05-13 19:42:12
【问题描述】:
这是一个冒泡排序算法可视化代码。我想要交换矩形。但是,我无法做到。当我运行程序时,它会等待一段时间,最多 2 秒,然后所有矩形都在移动,它会持续 1 秒或其他时间。问题是我猜的线程,我该怎么办?
public void bubbleSort(Rectangle[] rectangles) throws InterruptedException {
int pass = 1;
for(int j = 0; j < rectangles.length-1; j++) {
for (int i = 0; i < rectangles.length - 1-j; i++) {
int pos = i;
if (rectangles[i].getHeight() > rectangles[i + 1].getHeight()) {
Runnable task = new Runnable() {
@Override
public void run() {
try {
System.out.println("opıjapısdjapsoıdj");
Platform.runLater(new Runnable() {
@Override
public void run() {
createAnimation(pos, pos + 1);
System.out.println("xxxxxxx");
}
});
Thread.sleep(2000);
} catch (InterruptedException exception) {
// nothing
}
}
};
new Thread(task).start();
Rectangle temp = rectangles[i];
rectangles[i] = rectangles[i + 1];
rectangles[i + 1] = temp;
}
}
}
}
【问题讨论】:
-
任务之间没有延迟。任务本身有延迟,但该延迟仅对每个任务是本地的。更不用说延迟是在您使用 FX 线程(即
runLater)安排操作之后。无论如何,为此使用线程可能有点矫枉过正,而且麻烦更多。 -
将您的排序算法分解为离散(但可重复)的步骤。然后use the animation API to periodically execute算法的下一步。当该步骤完成时,UI 应更新以反映新状态。现在算法暂停,直到执行下一步。这一直持续到算法完成。请参阅event-driven programming 和state pattern。
-
请不要重新发布相同的问题 .. 而是根据需要编辑旧的以包含详细信息(特别是 minimal reproducible example)
-
我会听从@Slaw 的建议。首先,我将创建一个包含每个排序状态的 List 列表。然后我会使用
AnimationAPI 中的Timeline每秒显示不同的状态。 -
这能回答你的问题吗? Dynamic Bar chart in Java FX
标签: java multithreading sorting javafx visualization