现有一个需求。
for循环一个列表,每个循环体内需要访问服务器,每次要等待结果返回,再进入到下一个循环体中。
这样做速度太慢了,于是决定采用多线程。
由于我的for循环的次数不多,所以每个循环体内用不同线程去执行
最后统一返回。
//定义一个线程池,核心线程数为50
private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(50);
//线程数量为for循环次数 加 1,加1是因为还有一个主线程。
int threadCount = projects.size() + 1;
//定义栅栏,大小必须小于线程池分配线程数,我这里 projects.size()比较小
CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount);
try {
for (Project project : projects) {
fixedThreadPool.submit(()->{
try {
//业务代码,这块根据不同的需求来写。
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//线程执行完后阻塞,所有线程阻塞的之后,解放
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
} finally {
//主线程阻塞
cyclicBarrier.await();
}
//最后返回结果,是循环体执行完之后的结果。
return projects;
这样做,就可以完美实现我们的需求啦。