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个线程随时运行?
答案 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个线程都用完了。