JavaFx 绑定在单个线程上顺序更新,如何强制多线程

问题描述 投票:0回答:1

我在 UI 上有 4 个 JavaFx Text 对象。这 4 个对象绑定到 4 个不同的 DoubleBinding

我有一个叫做价格的双重属性。

所有 4 个 DoubleBindings 都绑定到此价格属性。本质上,当价格发生变化时,会使用价格执行 4 种不同的计算,并更新 4 个不同的字段。

 volatilityProperty = new DoubleBinding() {
            {
                super.bind(priceProperty);
            }
            @Override
            protected double computeValue()
            {
            }
}

这一切都很有效。

但是我注意到,当价格发生变化时,每个 DoubleBindings 都会在单个线程中顺序调用,并调用其computeValue 方法。是否有一个选项可以让每个 DoubleBindings 在价格发生变化时立即在新线程中启动?

我尝试在双绑定的重写的computeValue中使用Task来强制多线程 - 但由于某种原因,如果在每个DoubleBindings中使用任务,则需要更长的时间才能完成所有4个计算。

java javafx javafx-8 javafx-11
1个回答
0
投票

不。 JavaFX 属性必须在一个且仅一个线程中设置:JavaFX 应用程序线程。但是,您可以绑定到使用任务在其他线程中进行计算的Service

public class VolatilityCalculator
extends Service<Double> {
    private final DoubleProperty price;

    public double getPrice() {
        return price.get();
    }

    public void setPrice(double price) {
        this.price.set(price);
    }

    public DoubleProperty priceProperty() {
        return price;
    }

    public VolatilityCalculator() {
        this.price = new DoubleProperty(this, "price");
    }

    @Override
    protected Task<Double> createTask() {
        double priceForCalculations = getPrice();

        return new Task<Double>() {
            @Override
            protected Double call()
            throws InterruptedException {
                // Long-running computation code goes here.
                // That code may want to check isCancelled() periodically.
            }
        }
    }
}

那么您的应用程序可以:

  • 绑定到服务的
  • 将服务的价格属性绑定到应用程序的价格属性

像这样:

VolatilityCalculator volatilityCalculator = new VolatilityCalculator();
volatilityCalculator.priceProperty().bind(priceProperty);
volatilityProperty.bind(volatilityCalculator.valueProperty());

有关货币价值的强制性说明:

double
不存储确切的值。如果这只是一个学习或学校项目,那没问题,但商业应用程序一定不能将金钱存储为
double
值,因为这些值实际上可能会丢失信息。 BigDecimal 是推荐的货币存储类型。或者,有些人建议使用
int
long
代表以美分或美分的分数表示的价格(或者,如果不是美分,则以您所在国家/地区的最小货币单位为准)。

© www.soinside.com 2019 - 2024. All rights reserved.