2010-10-23 16 views
3

j'ai déjà un thread qui doit faire suite aux travaux:Java méthode asynchrone appel

public class DetectionHandler extends TimerTask { 

@Override 
public void run() { 
bluetoothAddresses = BluetoothModule.scanAddresses(); 
wiFiAddresses = WiFiModule.scanAddresses(); 
...//when scanning is finished, continue work 
} 

Je voudrais que la numérisation soit parallèle. Donc, je suppose que je dois appeler ces deux méthodes de manière asynchrone. Et lorsque cette analyse est terminée, je peux continuer à travailler dans la classe DetectionHandler.

J'ai essayé la façon dont BluetoothModule et WiFiModule implémente Runnable mais n'a pas eu de chance. Tnx

Répondre

4

En utilisant ExecutorService vous pouvez écrire quelque chose comme ceci:

ArrayList<Callable<Collection<Address>>> tasks = new ArrayList<Callable<Collection<Address>>>(); 
tasks.add(new Callable<Collection<Address>>() { 
    public Collection<Address> call() throws Exception { 
    return BluetoothModule.scanAddresses(); 
    } 
}); 
tasks.add(new Callable<Collection<Address>>() { 
    public Collection<Address> call() throws Exception { 
    return WiFiModule.scanAddresses(); 
    } 
}); 

ExecutorService executorService = Executors.newFixedThreadPool(2); 
List<Future<Collection<Address>>> futures = executorService.invokeAll(tasks); 
3

Obtenez un ExecutorService de Executors et attribuez-lui un FutureTask.

Vous pouvez ensuite attendre les résultats en appelant le blocage get() sur le Future retourné. Les analyses seront exécutées en parallèle, mais votre méthode d'exécution (affichée ici) attendra toujours que les analyses soient terminées.

Un peu comme:

 FutureTask<List<Address>> btFuture = 
     new FutureTask<List<Address>>(new Callable<List<Address>>() { 
     public List<Address> call() { 
      return BluetoothModule.scanAddresses(); 
     }}); 
    executor.execute(btFuture); 

    FutureTask<List<Address>> wfFuture = 
     new FutureTask<List<Address>>(new Callable<List<Address>>() { 
     public List<Address> call() { 
      return WifiModule.scanAddresses(); 
     }}); 
    executor.execute(wfFuture); 

    btAddresses = btFuture.get(); // blocks until process finished 
    wifiAddresses = wfFuture.get(); // blocks 

Attention cependant, obtenir retournera tout retour de l'appel. Les exceptions sont enveloppées dans une ExecutionException.

+1

tnak vous: je l'ai fait comme ça http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/ Chapitre10/concurrencyTools.html – vale4674

+0

@ vale4674 Si vous décidez de jouer avec des threads et de commencer à partager les données _between_ threads, je recommande vivement http://www.javaconcurrencyinpractice.com/ (le livre). L'utilisation de threads peut avoir des résultats étranges quand il n'est pas prudent. Pas un problème dans ce cas bien sûr. – extraneon