Version de synchronisation de la méthode asynchrone
Quelle est la meilleure façon de créer une version synchrone d'une méthode asynchrone en Java?
Disons que vous avez une classe avec ces deux méthodes:
asyncDoSomething(); // Starts an asynchronous task
onFinishDoSomething(); // Called when the task is finished
Comment implémenteriez - vous un doSomething()
synchrone qui ne retourne pas tant que la tâche n'est pas terminée?
1 réponses
Jetez un oeil à CountDownLatch . Vous pouvez émuler le comportement synchrone souhaité avec quelque chose comme ceci:
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();
}
Vous pouvez également obtenir le même comportement en utilisant CyclicBarrier
avec 2 parties comme ceci:
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();
}
Si vous avez le contrôle sur le code source de asyncDoSomething()
, je recommanderais cependant de le redessiner pour retourner un objet Future<Void>
à la place. En faisant cela, vous pouvez facilement basculer entre le comportement asynchrone / synchrone en cas de besoin comme ceci:
void asynchronousMain(){
asyncDoSomethig(); //ignore the return result
}
void synchronousMain() throws Exception{
Future<Void> f = asyncDoSomething();
//wait synchronously for result
f.get();
}