Size: a a a

2021 March 05

IZ

Ivan Zemlyankiy in pro.jvm
господа сеньёры/конкаренси мастера, помогите плз, я чёт туплю, видимо:

 CompletableFuture<Integer> fastRequest =
     CompletableFuture.supplyAsync(() -> new Random().nextInt(100));
 CompletableFuture<Integer> slowRequest =
     CompletableFuture.supplyAsync(
         () -> {
           try {
             Thread.sleep(1000);
           } catch (InterruptedException e) {
             throw new RuntimeException(e);
           }
           return 42;
         });

 return fastRequest.thenApply(
     result -> {
       if (result == 42) {
         return result;
       }

       try {
         return slowRequest.get();
       } catch (InterruptedException | ExecutionException e) {
         throw new RuntimeException(e);
       }
     });
}

как сделать эту логику полностью неблокируемой?
источник

IZ

Ivan Zemlyankiy in pro.jvm
Ну типа есть 2 запроса,один быстрый но не точный, а второй медленный, но точный. Нужно их соединить так чтобы на второй запрос пользователь забил, если первый вернул что нужно
источник

IZ

Ivan Zemlyankiy in pro.jvm
Само собой хочется обойтись без внешних хранилищ типа атомик референсов
источник

AK

Andrei K in pro.jvm
Там есть что-то типа CompletableFuture.any()
источник

AK

Andrei K in pro.jvm
Первый из
источник

IZ

Ivan Zemlyankiy in pro.jvm
Andrei K
Там есть что-то типа CompletableFuture.any()
Ну эни не подходит же тоже
источник

AK

Andrei K in pro.jvm
Почему?
источник

IZ

Ivan Zemlyankiy in pro.jvm
Ммм... ну да, в той постановке что я дал подходит. Но оригинальная задача у меня именно если первый ответил - значит берём его, если там ничего, то ждём второй
источник

IZ

Ivan Zemlyankiy in pro.jvm
вот так, наверное, правильнее спросить:
  CompletableFuture<Boolean> fastRequest =
     CompletableFuture.supplyAsync(() -> new Random().nextBoolean());
 CompletableFuture<Integer> slowRequest =
     CompletableFuture.supplyAsync(
         () -> {
           try {
             Thread.sleep(1000);
           } catch (InterruptedException e) {
             throw new RuntimeException(e);
           }
           return 41;
         });

   return fastRequest.thenApply(
       result -> {
         if (result) {
           return 42;
         } else {
           try {
             return slowRequest.get() + 1;
           } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
           }
         }
       });
источник

IZ

Ivan Zemlyankiy in pro.jvm
Ivan Zemlyankiy
вот так, наверное, правильнее спросить:
  CompletableFuture<Boolean> fastRequest =
     CompletableFuture.supplyAsync(() -> new Random().nextBoolean());
 CompletableFuture<Integer> slowRequest =
     CompletableFuture.supplyAsync(
         () -> {
           try {
             Thread.sleep(1000);
           } catch (InterruptedException e) {
             throw new RuntimeException(e);
           }
           return 41;
         });

   return fastRequest.thenApply(
       result -> {
         if (result) {
           return 42;
         } else {
           try {
             return slowRequest.get() + 1;
           } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
           }
         }
       });
как сделать эту пипяку неблокируемой?
источник

E

Evgeniy ♎️ in pro.jvm
Ivan Zemlyankiy
как сделать эту пипяку неблокируемой?
то есть вы хотите в медленном запросе сэкономить время быстрого запроса?
источник

E

Evgeniy ♎️ in pro.jvm
не проще дёрнуть быстрый и спокойно в зависимости от ответа дёрнуть или нет медленный
источник

YM

Yurii Melnychuk in pro.jvm
Ivan Zemlyankiy
вот так, наверное, правильнее спросить:
  CompletableFuture<Boolean> fastRequest =
     CompletableFuture.supplyAsync(() -> new Random().nextBoolean());
 CompletableFuture<Integer> slowRequest =
     CompletableFuture.supplyAsync(
         () -> {
           try {
             Thread.sleep(1000);
           } catch (InterruptedException e) {
             throw new RuntimeException(e);
           }
           return 41;
         });

   return fastRequest.thenApply(
       result -> {
         if (result) {
           return 42;
         } else {
           try {
             return slowRequest.get() + 1;
           } catch (InterruptedException | ExecutionException e) {
             throw new RuntimeException(e);
           }
         }
       });
CompletableFuture<Boolean> fastRequest =
   CompletableFuture.supplyAsync(() -> new Random().nextBoolean());
CompletableFuture<Integer> slowRequest =
   CompletableFuture.supplyAsync(
       () -> {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               throw new RuntimeException(e);
           }
           return 41;
       });

return fastRequest.thenCompose(
   result -> {
       if (result) {
           return CompletableFuture.completedFuture(42);
       } else {
           return slowRequest.thenApply(i -> i + 1);
       }
   });
источник

IZ

Ivan Zemlyankiy in pro.jvm
Evgeniy ♎️
то есть вы хотите в медленном запросе сэкономить время быстрого запроса?
да, именно так
источник

IZ

Ivan Zemlyankiy in pro.jvm
Evgeniy ♎️
не проще дёрнуть быстрый и спокойно в зависимости от ответа дёрнуть или нет медленный
нет, быстрый - он относительно быстрый )
источник

IZ

Ivan Zemlyankiy in pro.jvm
Yurii Melnychuk
CompletableFuture<Boolean> fastRequest =
   CompletableFuture.supplyAsync(() -> new Random().nextBoolean());
CompletableFuture<Integer> slowRequest =
   CompletableFuture.supplyAsync(
       () -> {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               throw new RuntimeException(e);
           }
           return 41;
       });

return fastRequest.thenCompose(
   result -> {
       if (result) {
           return CompletableFuture.completedFuture(42);
       } else {
           return slowRequest.thenApply(i -> i + 1);
       }
   });
эх, да, очень близко, но в slowRequest нужны данные из fastRequest
источник

IZ

Ivan Zemlyankiy in pro.jvm
я так понимаю просто использовать их там нельзя
источник

IZ

Ivan Zemlyankiy in pro.jvm
там + 1 был, типа результат из fastRequest
источник

n

nikitas🎅 in pro.jvm
есть кто нибудь
источник

n

nikitas🎅 in pro.jvm
кто шарит за винформс случайно
источник