2014-06-06 6 views

Odpowiedz

8

Wystarczy przekształcić runnables do callables:

List<Callable<Void>> callables = new ArrayList<>(); 
for (Runnable r : runnables) { 
    callables.add(toCallable(r)); 
} 
executor.invokeAll(callables); 

private Callable<Void> toCallable(final Runnable runnable) { 
    return new Callable<Void>() { 
     @Override 
     public Void call() { 
      runnable.run(); 
      return null; 
     } 
    }; 
} 
+2

świetnie .. to jest bardziej hack. Java ma bogaty zestaw API, więc zastanawiasz się, czy istnieje jakiś konkretny powód do pominięcia tej metody? –

15
Runnable task = new Runnable() { 
    public void run() { 

    } 
}; 

Callable<Object> c = Executors.callable(task); 

Podobnie stwierdzono, że Komornicy zapewnia metodę narzędzie do konwertowania Runnable zadanie do wywoływalnym zadania. To wyjaśnia, dlaczego nie mamy przeciążonego obiektu invokeAll, który również ma zadanie Runnable.