Я пытаюсь создать простой пример с async CompletableFuture, но я вижу странное поведение.Идея состоит в том, что я запускаю 2 асинхронных фьючерса, один активирует логический флаг по истечении заданного времени, а другие опрашивают этот флаг, чтобы освободить значение, как только поток 1 изменил этот флаг.Вот мой код:
package completablefutures;
import java.util.concurrent.CompletableFuture;
public class CFMain throws InterruptedException {
public static void main(String... args) {
CF cf = new CF();
CompletableFuture.supplyAsync(cf::getCompletable).thenRun(() -> System.out.println("Post-future action"));
CompletableFuture.supplyAsync(cf::doSleep);
Thread.sleep(10000);
}
}
И класс CF:
package completablefutures;
public class CF {
private boolean valueIsSafe = false;
public boolean getCompletable() {
System.out.println("Fetching completable");
while(true) {
if(this.valueIsSafe) {
System.out.println("Completable fetched");
return true;
}
}
}
public boolean doSleep() {
System.out.println("Started sleeping");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.valueIsSafe = true;
System.out.println("Finished sleeping");
return true;
}
}
Когда я запускаю программу, она печатает это:
ВыборкаComptable
Запущен сон
Закончен сон
Процесс завершен с кодом выхода 0
, т. е. будущее никогда не завершится в выделенных 10 с.Так что здесь происходит?