java - 在变化数量的线程中并发重复相同的任务

标签 java multithreading performance concurrency scheduledexecutorservice

我在 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();

但是,我既不喜欢它的外观,也不喜欢它的性能。

我调查了ScheduledExecutorServicescheduleWithFixedDelay同样,但他们不喜欢动态更改线程数量或延迟的想法。

什么会更快?什么会更好?还有其他我没有想到的方法吗? 我的解决方案对于这样的“基本”任务来说似乎太复杂了。

最佳答案

因此,为了更改线程数,ScheduledThreadPoolExecutor有一个名为 setCorePoolSize 的方法,这将允许您更改线程数。 (注意:这不在界面中!)

对于更改频率,最好的办法是对从第一个调度程序收到的 future 调用 cancel,然后使用新的频率再次添加。

关于java - 在变化数量的线程中并发重复相同的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40577238/

相关文章:

Java JFrame ComboBox情况

java - 使用以 BlockingQueue<Runnable> 作为参数的构造函数创建的 ThreadPoolExecutor 如何将 Callables 排入队列?

python - 套接字可以同时监听和连接吗

javascript - 关于文档性能问题的绑定(bind)事件

java - Thymeleaf:URL 中的参数未被替换

java - 如何使用 MUnit 在 Mule Flow 中模拟 Java 组件

python - Pandas 内部加入性能问题

c# - Foreach 语句需要很长时间

Java - 如何制作 "runnable"JTable?

c# - 是否可以在简单注入(inject)器的方法中使用线程范围的生活方式