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