2016-06-23 2 views
1
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?

+4

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

+0

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. –

+0

@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. –

Antwort

0

Eine mögliche Lösung, obwohl ich es nicht idiomatisch nennen würde;), besteht darin, 2 verschiedene Bindungen an c zu liefern. Beide Bindungen haben die gleiche computeValue Methode, aber eine davon bindet nur an a (oder b, je nach Ihren Bedürfnissen).

Die Thread-Anzeige c würde dann Zugriff auf die Bindung erhalten, die nur aktualisiert wird, wenn sich ein Wert ändert.

private final ObjectBinding<BigDecimal> c    = new ObjectBinding<BigDecimal>() 
                { 
                 { 
                 super.bind(a, b); 
                 } 

                 @Override 
                 protected BigDecimal computeValue() 
                 { 
                 return a.getValue().add(b.getValue()); 
                 } 
                }; 

private final ObjectBinding<BigDecimal> cOnlyOnBChange = new ObjectBinding<BigDecimal>() 
                { 
                 { 
                 super.bind(b); 
                 } 

                 @Override 
                 protected BigDecimal computeValue() 
                 { 
                 return a.getValue().add(b.getValue()); 
                 } 
                }; 

Siehe full example.

Verwandte Themen