Посмотрите на 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
с двумя партиями, подобными этому:контроль над исходным кодом asyncDoSomething()
Я бы, однако, рекомендовал перепроектировать его так, чтобы он возвращал объект Future<Void>
.Делая это, вы можете легко переключаться между асинхронным / синхронным поведением, когда это необходимо:
void asynchronousMain(){
asyncDoSomethig(); //ignore the return result
}
void synchronousMain() throws Exception{
Future<Void> f = asyncDoSomething();
//wait synchronously for result
f.get();
}