2015-12-06 2 views
1
private final ExecutorService pool = Executors.newFixedThreadPool(5); 

for (ProductInfo prod : product) { 
       pool.execute(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          prod.checkout(processList); 
         } catch (InterruptedException e) { 
          log.error("PRODUCT INFO EXCEPTION", e); 
         } 
        } 
       }); 
      } 

Все звонки в prod.checkout метод вызова различных интерфейсов, не имеющих никакой связи между ними.Как запустить более двух потоков simultaneosly

ProductInfo.java

@Async 
    public void checkout(List<ProcessLog> list) throws InterruptedException { 
     process = processUtil.start(getHome(), job); 
     list.add(process); 
     preprocess(); 
     execute(); 
     postprocess(); 
     list.remove(process); 
     processUtil.end(process); 
    } 

В любое время я вижу только две нити работает, что я могу сделать, чтобы сделать 5 потоков работает в любое время?

+0

Вы смешиваете два подхода: @ Async (если вызывается правильно @ Injected object) будет выполняться асинхронно в любом случае, поэтому добавление ExecutorService не может купить вам ничего, кроме очереди lls для проверки из разных потоков. – Jan

+0

@Jan: Первоначально я вызывал чек непосредственно (без исполнителя), чем я видел только 2 потока, работающих одновременно. –

+0

@AbhishekAgarwal Попробуйте удалить аннотацию Async и поместите Thread.sleep (5000l); в пределах кода заказа, чтобы он запускался по крайней мере в течение нескольких секунд. При необходимости поставьте этот оператор System.out.println (Thread.currentThread(). GetId()); знать количество активных аддов –

ответ

1

Используйте ДВУХ Боб.

@Service 
public class CheckoutService { 

    @Async 
    public void checkout(List<ProcessLog> list) throws InterruptedException { 
     process = processUtil.start(getHome(), job); 
     list.add(process); 
     preprocess(); 
     execute(); 
     postprocess(); 
     list.remove(process); 
     processUtil.end(process); 
    } 
} 

Второй боб вызвать первый, так что Spring может обрабатывать @Aync (см этот ответ для более подробной информации о причинах раскола: https://stackoverflow.com/a/22561903/280244)

@Service 
public class CheckoutAsyncInvoker { 

    @Autowired 
    CheckoutService checkoutService 

    public void runner() 
     for (ProductInfo prod : product) { 
      processList=... 
      this.checkoutService.checkout(processList); 
     } 
    } 
} 

Конфигурация:

@Configuration 
@EnableAsync 
public class AppConfig implements AsyncConfigurer { 

    @Override 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(5); 
     executor.setMaxPoolSize(5); 
     executor.setQueueCapacity(11); 
     executor.setThreadNamePrefix("MyExecutor-"); 
     executor.initialize(); 
     return executor; 
    } 
} 
0

Возможно, это потому, что в методе checkout() есть аннотация @Async. Как только метод checkout() называется исполнением в методе run(), упомянутом здесь, завершен, а код внутри checkout() запущен в совсем другом потоке, отличном от этого пула потоков.

Если вы удалите эту аннотацию и убедитесь, что метод выполняется в течение некоторого времени, вы можете увидеть, что все 5 потоков истощаются.

Смежные вопросы