Вызов асинхронного метода Java - PullRequest
3 голосов
/ 23 октября 2010

У меня уже есть один поток, который должен выполнять следующую работу:

public class DetectionHandler extends TimerTask {

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

Я бы хотел, чтобы сканирование было параллельным. Поэтому я предполагаю, что я должен вызывать эти два метода асинхронно. И когда сканирование закончится, я смогу продолжить работу в классе DetectionHandler.

Я пробовал способ, которым BluetoothModule и WiFiModule реализуют Runnable, но безуспешно. Tnx

Ответы [ 2 ]

4 голосов
/ 23 октября 2010

Используя ExecutorService , вы можете написать что-то вроде этого:

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 голосов
/ 23 октября 2010

Получите ExecutorService от Executors и дайте ему FutureTask .

Затем вы можете дождаться результатов, вызвав блокировку get () для возвращенного Future. Сканирование будет выполняться параллельно, но ваш метод запуска (показанный здесь) все еще будет ждать завершения сканирования.

Немного похоже:

     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

Будьте осторожны, get вернет любой вызов. Исключения обернуты в ExecutionException.

...