private final Property<BigDecimal> a = new SimpleObjectProperty<BigDecimal>();
private final Property<BigDecimal> b = new SimpleObjectProperty<BigDecimal>();
private ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>() {
{
super.bind(a, b);
}
@Override
protected BigDecimal computeValue() {
return a.getValue().add(b.getValue());
}
};
public BigDecimal getC() { return c.getValue(); }
Ich habe zwei Eigenschaften und einen Wert, der an die Summe dieser Eigenschaften gebunden ist. Ich habe einen Thread anzeigen c
und Aufruf getC()
, wenn es geändert wird, und ein anderer Thread, der aktualisiert werden soll a
& b
. Ich möchte, dass das Update auf a
& b
atomar ist; Ich möchte nicht den Wert von c
beobachtet werden, wenn a
wurde aktualisiert, aber b
hat nicht.JavaFX: Aktualisieren Sie die Bindung erst, nachdem alle Abhängigkeiten aktualisiert wurden?
Die Lösung kam ich mit ist eine dritte Eigenschaft zu haben, die c
‚s Bindung verwendet als Flag Update Abschluss zu signalisieren, so etwas wie
update(a, 1);
update(b, 2);
update(updateComplete, true); // C is only computed at this point
private final Property<BigDecimal> a = new SimpleObjectProperty<BigDecimal>();
private final Property<BigDecimal> b = new SimpleObjectProperty<BigDecimal>();
private final IntegerProperty updateComplete = new SimpleIntegerProperty(0);
private ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>() {
{
super.bind(updateComplete);
}
@Override
protected BigDecimal computeValue() {
return a.getValue().add(b.getValue());
}
};
public BigDecimal getC() { return c.getValue(); }
Gibt es eine idiomatische Lösung für dieses Problem?
Ehrlich gesagt, glaube ich nicht, dass Eigenschaften eine gute Lösung für die Kommunikation zwischen Threads sind. Es gibt wahrscheinlich Systeme, die für solche Aufgaben besser geeignet sind (zB [Actors] (http://doc.akka.io/docs/akka/current/java/untyped-actors.html), [java.util.concurrent] (https : //docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html) und [javafx.concurrent] (https://docs.oracle.com/javase/8/) javafx/api/javafx/gleichzeitige/package-summary.html)). – jewelsea
Wie verwalten Sie die Synchronisierung zwischen den Threads? JavaFX-Eigenschaften sind nicht vom Design her threadsicher: Ich habe Schwierigkeiten zu sehen, wie Sie die Lebendigkeit von "c" sicherstellen würden, wenn es (indirekt, durch Aktualisieren von "a" und/oder "b") von einem anderen Thread aktualisiert würde eine, auf der du es beobachtet hast. –
@James_D Richtig. Ich versuche herauszufinden, wie man diese Synchronisation am besten verwaltet, so dass _interim Werte von 'c'_-wenn' a' aktualisiert wurde, aber 'b' nicht, oder umgekehrt-nicht beobachtet werden. Das Anzeigen einer älteren (gültigen) Version von "c" ist in Ordnung. –