2016-11-14 2 views
1

В структуре исполнителей Java для ожидания до завершения всех задач у нас есть метод invokeAll(). Но при использовании весны ThreadPoolTaskExecutor у нас есть только метод отправки, который возвращает объект Future.So здесь после завершения Первая задача - начать следующую задачу. Итак, если я хочу подождать, пока все выполненные задачи не будут выполнены? означает, что есть какой-либо метод, доступный в пружине, которая равна invokeAll() Пожалуйста, поправьте меня, если я понимаю неправильно ..java executor framework invokeВсего эквивалентного метода в весеннем исполнителе

+0

Возможно, нет, я проверил, что все классы включают метод invokeAll(), но все они указывают на классы пакетов java.util.concurrent. – Crabime

ответ

0

Вы можете обернуть TaskExecutor с org.springframework.core.task.support.ExecutorServiceAdapter:

ExecutorServiceAdapter adapter = new ExecutorServiceAdapter(taskExecutor); 

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

Надеюсь, что это поможет.

+0

На ваш взгляд, этот вопрос возвращается к java, но не к весне. Здесь я думаю, вам стоит больше подумать о связи между ThreadPoolTaskExecutor и ExecutorServiceAdapter. – Crabime

+0

@Crabime ExecutorServiceAdapter связан с весной рамки? – PSR

0

Всегда сбой в ThreadPoolTaskExecutor Исходный код сделал меня глупым. вы напоминаете мне, стоит ли ExecutorServiceAdapter весной. Теперь я думаю, да, и вот мой код, чтобы ответить на ваш вопрос, надеюсь, что не так.

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)); 
Смежные вопросы