For循环分组多线程一起执行
最近有遇到一个问题,for循环List数组太大,业务代码块执行时间也长,导致接口运行时间太长,超时失败,想了下,能不能将数组分割成多个,然后多线程一起执行, 来降低时间,下面贴下代码。
首先是将数组先分割成多组:
public static <ExternalPurchaseOrderData> List<List<ExternalPurchaseOrderData>> averageAssign(List<ExternalPurchaseOrderData> source, int n){
List<List<ExternalPurchaseOrderData>> result=new ArrayList<List<ExternalPurchaseOrderData>>();
int remaider=source.size()%n; //(先计算出余数)
int number=source.size()/n; //然后是商
int offset=0;//偏移量
for(int i=0;i<n;i++){
List<ExternalPurchaseOrderData> value=null;
if(remaider>0){
value=source.subList(i*number+offset, (i+1)*number+offset+1);
remaider--;
offset++;
}else{
value=source.subList(i*number+offset, (i+1)*number+offset);
}
result.add(value);
}
return result;
}
然后多线程一起执行用了CountDownLatch
public static void main(String[] args) throws InterruptedException {
int size = 3;
final CountDownLatch count = new CountDownLatch(1);
for(int i=0;i<size;i++){
new Thread(new Runnable() {
@Override
public void run() {
try {
count.await();
System.out.print(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
Thread.sleep(5000);
count.countDown();
}