我在 JavaFX GUI 中有一个图形,我想要将其动画化。
正如您可能知道的,您无法在主线程之外更改 JavaFX GUI,因此要模仿动画,您必须创建一个工作线程,然后将 Runnables 提供给主线程。
现在我的目标是同时异步地为图形的不同部分设置动画,同时能够更改一次的数量以及延迟。我在 GUI 中添加了 slider 。
我通过创建一个“ThreadSpawner”解决了这个问题,该线程又创建了 n 个线程(这些线程在完成一次任务后就死亡了)。
Task<Void> spawner = new Task<Void>() {
@Override
public Void call() throws InterruptedException {
while () {
for (int n = 0; n < amount; n++) {
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}
Thread.sleep(delay);
}
return null;
}
};
Thread th = new Thread(spawner);
th.setDaemon(true);
th.start();
但是,我既不喜欢它的外观,也不喜欢它的性能。
我调查了ScheduledExecutorService和 scheduleWithFixedDelay同样,但他们不喜欢动态更改线程数量或延迟的想法。
什么会更快?什么会更好?还有其他我没有想到的方法吗? 我的解决方案对于这样的“基本”任务来说似乎太复杂了。
最佳答案
因此,为了更改线程数,ScheduledThreadPoolExecutor有一个名为 setCorePoolSize 的方法,这将允许您更改线程数。 (注意:这不在界面中!)
对于更改频率,最好的办法是对从第一个调度程序收到的 future 调用 cancel
,然后使用新的频率再次添加。
关于java - 在变化数量的线程中并发重复相同的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40577238/