Пример сценария:
Ниже приведен упрощенный пример, в котором мне нужно найти 500 случайных простых чисел от 0 до 10 000 000.
Использование ожидания:
Код: Выделить всё
static void waitWithAwaitility() {
AtomicInteger primeCount = new AtomicInteger(0);
await()
.atMost(1, TimeUnit.HOURS)
.pollInterval(3, TimeUnit.SECONDS)
.until(() -> {
int number = supplierMethod().get();
if (isPrime(number)) {
System.out.println("Found prime: " + number);
primeCount.incrementAndGet();
}
return primeCount.get() >= 500;
});
}
Код: Выделить всё
public static Supplier supplierMethod() {
int number = new Random().nextInt(10_000_000) + 1;
System.out.println("Generated number: " + number);
return () -> number;
}
public static boolean isPrime(int number) {
if (number repeat.delayElements(pollInterval))
.takeUntil(condition::test)
.last()
.timeout(timeout, Mono.error(new RuntimeException("Timeout exceeded")))
.onErrorResume(throwable -> {
System.err.println(throwable.getMessage());
return Mono.empty();
})
.subscribeOn(Schedulers.boundedElastic());
}
static void waitWithJavaRx() {
AtomicInteger primeCount = new AtomicInteger(0);
Mono result = new DifferentAwaitility().reactiveAwait(
() -> supplierMethod().get(),
number -> {
boolean primeStatus = isPrime(number);
System.out.println("Is prime? " + primeStatus);
if (primeStatus) {
primeCount.incrementAndGet();
}
return primeCount.get() >= 500;
},
Duration.ofSeconds(3),
Duration.ofHours(1)
);
Integer finalResult = result.block();
if (finalResult != null) {
System.out.println("Result: " + finalResult);
} else {
System.err.println("Error: Timeout or other failure occurred");
}
}
Хотя этот подход работает, потребление памяти составило три раз выше, чем при использовании Awaitility. Ниже приведены снимки экрана VisualVM, сравнивающие использование памяти:

< /p>
- Использование памяти ожидания
- Использование памяти реактивного программирования
Есть ли лучший подход к достижению той же функциональности, что и Awaitility, но с меньшим потреблением памяти? Я изучал реактивное программирование, но оно не помогло сократить использование памяти. Будем очень признательны за любые предложения или оптимизации!
Подробнее здесь: https://stackoverflow.com/questions/792 ... asynchrono