Возможно ли заблокировать / дождаться уже существующей асинхронной функции?

#java #asynchronous #java-threads

#java #асинхронный #java-потоки

Вопрос:

 SomeLibrary lib = new SomeLibrary();
lib.doSomethingAsync(); // some function from a library I got and what it does is print 1-5 asynchronously
System.out.println("Done");

// output
// Done
// 1
// 2
// 3
// 4
// 5
  

Я хочу прояснить, что я не создавал doSomethingAsync() функцию, и я не в состоянии ее изменить. Я хочу найти способ заблокировать эту асинхронную функцию и печатать Done после чисел от 1 до 5, потому что, как вы видите, Done печатается мгновенно. Есть ли способ сделать это на Java?

Комментарии:

1. Что doSomethingAsync() возвращает? Если это void, то вам не повезло.

2. Вы пробовали lib.doSomethingAsync().join() ?

3. @ZahidKhan join() не существует для lib.doSomethingAsync()

4. Короткий ответ: вы не можете. Длинный ответ: вы могли бы наблюдать за тем, что делает этот метод, и ждать, пока это не произойдет. Если бы вы могли предоставить более подробную информацию о том, что делает этот метод, мы могли бы помочь лучше.

Ответ №1:

Вы можете использовать CountDownLatch следующим образом:

 final CountDownLatch wait = new CountDownLatch(1);
SomeLibrary lib = new SomeLibrary(wait);
lib.doSomethingAsync(); // some function from a library I got and what it does is print 1-5 asynchronously
//NOTE in the doSomethingAsync, you must call wait.countDown() before return
wait.await(); //-> it wait in here until wait.countDown() is called.
System.out.println("Done");
  

В конструкторе SomeLibrary :

 private CountDownLatch  wait;
public ScannerTest(CountDownLatch  _wait) {
    this.wait = _wait;
}
  

В методе doSomethingAsync() :

 public void doSomethingAsync(){
   //TODO something
   ...
   this.wait.countDown();
   return;
}
  

Комментарии:

1. Извините @TruongNguyen, но я сказал, что не могу изменить указанную функцию / библиотеку.

2. О, не могли бы вы поделиться информацией о SomeLibrary (другие методы, его класс supper, …) и информацией о DoSomethingAsync (возвращаемый тип).

Ответ №2:

Это достигается несколькими способами в стандартных библиотеках :-

Обратный вызов завершения

Клиенты часто могут вызывать функцию поставщика после завершения асинхронной задачи. Эта функция обычно получает некоторую информацию о проделанной работе по мере ввода.

Future.get()

Асинхронные функции возвращаются Future для синхронизации клиента. Подробнее о них можно прочитать здесь .

Проверьте, доступен ли какой-либо из этих параметров (возможно, перегруженная версия?_ в методе, который вы хотите вызвать. Нередко библиотеки включают как синхронизирующую, так и асинхронную версию некоторой бизнес-логики, чтобы вы тоже могли ее искать.