WItam,
mam taką zagwozdkę.
Uruchamiam sekwencyjnie listę CompletableFuture jeden po drugim aż do momentu gdy pierwszy zwróci pożądany wynik. Ponieważ nie wiem ile tych iteracji będzie opakowuje wszystko w pętlę while(shouldKeepReading) i gdy dostanę odpowiedni wynik z future przerywam pętlę. Zmienna shouldKeepReading jest volatile aby zachować relacje happens-before. Wydaje się wszystko powinno działać ale jednak pętla nie zatrzymuje się po pierwszym spełnionym warunku. Zazwyczaj wykonuje jeszcze następny, tak jakby kolejna egzekucja nie widziała zmienionej flagi wyjścia z pętli. Trochę mnie to dziwi ponieważ mamy relacje write-read, czyli żaden kolejny odczyt nie powinien widzieć starej wartości jeśli wcześniej nastąpiła zmiana warunku.
Ktoś może wie dlaczego to nie działa i czego tu brakuje?
volatile boolean shouldKeepReading = true;
....
List<Supplier<CompletableFuture<Integer>>> listOfPromises;
while (shouldKeepReading) {
listOfPromises.getNext().get().thenApply(result -> {
if (conditionPass(result)) {
shouldKeepReading = false;
}
return res;
});
}
Pozdrawiam
Maciej
scibi_92