多返回值多线程
ExecutorService threadPool = Executors. newFixedThreadPool(poolsize);
for (int i = 0; i < contracts.length; i++) {
Callable c = new Build(contracts[i]);
Future<model> f = threadPool.submit(c);
futures.add(f);
}
threadPool.shutdown();
for (Future<model> fu : futures) {
try {
evidenceList.add(fu.get());
} catch (InterruptedException e) {
msgResult +=e.getCause().getMessage();
} catch (ExecutionException e) {
msgResult +=e.getCause().getMessage();
}
}
}
```java
@Autowired
private TaskExecutor taskExecutor;
public void auditImages(List<String> urls) {
try {
//初始化队列
final BlockingQueue<Future<result>> queue = new LinkedBlockingDeque<>(urls.size());
//实例化自定义线程池
final CompletionService<result> completionService = new ExecutorCompletionService<>(taskExecutor, queue);
for (String url:urls){
completionService.submit(new Callable<result>() {
@Override
public result call() throws Exception {
//处理数据
return checkImg(url);
}
});
}
//获取结果
for (String url:urls) {
try {
Future<result> take = completionService.take();
result result = take.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("completionService.take InterruptedException", e);
} catch (ExecutionException e) {
log.error("take.get() ExecutionException", e);
}
}
} catch (BusinessException e) {
log.error("图片审核异常", e);
throw e;
} catch (Exception e) {
log.error("图片审核异常", e);
throw e;
}
}