Синхронная версия асинхронного метода

Каков наилучший способ сделать синхронную версию асинхронного метода в Java?

Скажем, у вас есть class с этими двумя способами:

asyncDoSomething(); // Starts an asynchronous task onFinishDoSomething(); // Called when the task is finished 

Как бы вы реализовали синхронный doSomething() , который не возвращается, пока задача не будет завершена?

Посмотрите на CountDownLatch . Вы можете эмулировать желаемое синхронное поведение с чем-то вроде этого:

 private CountDownLatch doneSignal = new CountDownLatch(1); void main() throws InterruptedException{ asyncDoSomething(); //wait until doneSignal.countDown() is called doneSignal.await(); } void onFinishDoSomething(){ //do something ... //then signal the end of work doneSignal.countDown(); } 

Вы также можете добиться такого же поведения, используя CyclicBarrier с двумя сторонами, такими как:

 private CyclicBarrier barrier = new CyclicBarrier(2); void main() throws InterruptedException{ asyncDoSomething(); //wait until other party calls barrier.await() barrier.await(); } void onFinishDoSomething() throws InterruptedException{ //do something ... //then signal the end of work barrier.await(); } 

Если у вас есть контроль над исходным кодом asyncDoSomething() я бы, однако, рекомендовал перепроектировать его, чтобы вместо этого вернуть объект Future . Поступая таким образом, вы можете легко переключаться между асинхронным / синхронным поведением, когда это необходимо:

 void asynchronousMain(){ asyncDoSomethig(); //ignore the return result } void synchronousMain() throws Exception{ Future f = asyncDoSomething(); //wait synchronously for result f.get(); } 
Interesting Posts

Как скрыть из программы, что она работает на виртуальной машине?

Какова цель заявления о возврате?

Что такое объект classа (java.lang.Class)?

Изменить внешний вид «Отметить как прочитанный» Поведение

Преобразовать строку в int в Rust?

Как отправить SMS с моего ПК с помощью iPhone?

Как импортировать собственную библиотеку (.so-файл) в Eclipse?

Почему циркулярные ссылки считаются вредными?

используя ITextSharp для извлечения и обновления ссылок в существующем PDF-файле

Как программно удалить существующее правило, которое было определено в XML?

Печать всех глобальных переменных / локальных переменных?

Файлы, скрытые на жестком диске USB из-за вируса, как очистить?

Поиск всех повторяющихся строк, включая «элементы с меньшими индексами»,

Простой, простой способ создания символических ссылок в Windows?

Добавление Google Cloud Messagin (GCM) для Android – Процесс регистрации

Давайте будем гением компьютера.