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?

27
demandé sur hpique 2011-01-09 18:00:08

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();
}
64
répondu rodion 2011-01-09 15:23:44