如何同时运行两个以上的线程

时间:2015-12-06 10:24:06

标签: java spring

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 方法的所有调用都会调用不同的api,它们之间没有相关性。

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个线程随时运行?

2 个答案:

答案 0 :(得分: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);
    }
}

第二个bean调用第一个bean,因此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;
     }
 }

答案 1 :(得分:0)

可能是因为checkout()方法上有@Async注释。一旦调用checkout()方法,run()中的执行就完成了这里提到的方法,checkout()中的代码在一个完全不同于该线程池的不同线程中运行。

如果你删除这个注释并确保该方法执行了一段时间,那么你可以看到所有5个线程都用完了。

相关问题