多线程和线程池

有这样一个需求:你有一个list集合,需使用该list作为参数,调用另一个系统并返回结果后处理它(主要的目的是处理结果)
解决方案:用线程池,不关闭线程池,将多个线程放入一个List集合中,使用invokeAll方法,相当于是将多个线程打包执行,统一返回,这样线程池可以一直不关闭,不用为了一个list开一个线程池,并且多个线程打包调用不会造成和其他用户的多线程冲突(究竟是你的线程还是我的线程):
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.invokeAll(List<new ExeRuleThread implement Callable<Objec>>);
sample: https://blog.csdn.net/u014046563/article/details/89053115?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

另一種解決思路:使用非返回結果的綫程,但傳入一個空的結果集合,在綫程中處理結果,例如:
paramList//參數集合
resultMap = new HashMap()//結果集合

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < paramList.size(); i++) {
inputParam = paramList.get(i);
cachedThreadPool.execute(new ExeRuleThread(inputParam......,resultMap) implements Runnable);
}
cachedThreadPool.shutdown();

try {
cachedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
logger.error("cachedThreadPool time out");
}

posted @ 2017-06-08 21:51  m.z  阅读(130)  评论(0编辑  收藏