2016-11-14 5 views
1

Im Java-Executor-Framework bis zur Fertigstellung aller Aufgaben haben wir invokeAll() -Methode. Aber während der Verwendung von Spring ThreadPoolTaskExecutor haben wir nur Methode übergeben, die Future-Objekt zurückgibt.So hier nach Abschluss der erste Aufgabe es wird nächste Aufgabe gestartet werden.So wenn ich warten möchte, bis alle Aufgaben abgeschlossen ist gibt es eine Möglichkeit, es zu tun? bedeutet, ist es eine Methode, im Frühjahr zur Verfügung, die zu invokeAll() gleich ist mir bitte korrigieren, wenn mein Verständnis falsch ist ..Java-Executor-Framework invokeAll gleichwertige Methode im Frühjahr Executor

+0

vielleicht nicht, ich habe überprüft alle Klassen enthalten invokeAll() -Methode, aber sie alle zeigen auf java.util.concurrent Paketklassen. – Crabime

Antwort

0

Sie Ihren TaskExecutor mit org.springframework.core.task.support.ExecutorServiceAdapter wickeln können:

ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(taskExecutor); 

List<Future<V>> futures = adapter.invokeAll(tasks); 

Hoffe es hilft.

+0

Ihrer Meinung nach, diese Frage zurück zu Java, aber nicht Frühling, hier denke ich, dass Sie mehr über die Beziehung zwischen ThreadPoolTaskExecutor und ExecutorServiceAdapter denken sollten. – Crabime

+0

@Crabime ExecutorServiceAdapter ist mit Spring Framework verwandt? – PSR

0

Immer Fehler in ThreadPoolTaskExecutor Quellcode machte mich dumm. Du erinnerst mich daran, ob ExecutorServiceAdapter zum Frühling gehört. Jetzt denke ich ja, und hier ist mein Code, um Ihre Frage zu beantworten, hoffe nicht falsch.

ThreadPoolTaskExecutor threadPool = atx.getBean("threadPool", ThreadPoolTaskExecutor.class); 
    ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(threadPool); 
    List<Callable<Integer>> tasks = new ArrayList<>(); 
    Callable<Integer> task = null; 
    for (int i = 0; i < 10; i++){ 
     task = new Callable<Integer>() { 
      @Override 
      public Integer call() throws Exception { 
       int time = new Random().nextInt(1000); 
       Thread.sleep(100); 
       System.out.println(Thread.currentThread().getName() + " has slept " + time); 
       return time; 
      } 
     }; 
     //submit task and wait to execute 
     threadPool.submit(task); 
     //add all task to list 
     tasks.add(task); 
    } 

    //get the start time of all threads 
    long start = System.currentTimeMillis(); 
    try { 
     List<Future<Integer>> result = adapter.invokeAll(tasks); 
     for (int i = 0; i < result.size(); i++){ 
      System.out.println(result.get(i).get()); 
     } 
    } catch (ExecutionException ex){ 
     ex.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Total time is " + (System.currentTimeMillis() - start)); 
Verwandte Themen