创建线程池
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1000,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(9000),
new CustomizableThreadFactory("joggle-pool-%d"));
调用线程方法:往外传参
int i=0;
if(i*size<=total){
map0.put("startrow",i*size+"");
map0.put("endrow",(i+1)*size+"");
Future<List<Map<String,Object>>> list =(Future<List<Map<String,Object>>>)executor.submit(() -> {
List<Map<String,Object>> listEx = new ArrayList<>(size);
try {
logger.info("异步线程调用开始...");
listEx=oltFaultUserTabDao.listOnuTcData(map0);
} catch (Exception e) {
logger.info("异步线程调用失败", e);
}
return listEx;
});
logger.info("查询 onu_tc_data表 第"+i+"次,获取到的数据:"+ list.get().size()+">>>");
listAll.addAll(list.get());
list.get().clear();
i++;
}
调用线程方法:不往外传参(参数不能共有,存在资源不同步给最终数据的问题)
AtomicInteger i = new AtomicInteger(0);
if(i.intValue()*size<=total){
executor.submit(() -> {
try {
map0.put("startrow",i.intValue()*size+"");
map0.put("endrow",(i.intValue()+1)*size+"");
logger.info("异步线程调用开始...");
List<Map<String,Object>> list =oltFaultUserTabDao.listOnuTcData(map0);
logger.info("查询 _data表 第"+i+"次,获取到的数据:"+ list.size()+">>>");
i.incrementAndGet();
} catch (Exception e) {
logger.info("异步线程调用失败", e);
}
});
}
接口样例
public List<Map<String,Object>>myTask(int size,int total,Map<String,String> map0) throws ExecutionException, InterruptedException {
logger.info("myTask 开始执行....");
List<Map<String,Object>> listAll = new ArrayList<>(4000000);
for(AtomicInteger i = new AtomicInteger(0);i.intValue()*size<=total;i.incrementAndGet()){
Future<List<Map<String,Object>>> list =(Future<List<Map<String,Object>>>)executor.submit(() -> {
List<Map<String,Object>> listEx = new ArrayList<>(size);
try {
map0.put("startrow",i.intValue()*size+"");
map0.put("endrow",(i.intValue()+1)*size+"");
listEx=oltFaultUserTabDao.listOnuTcData(map0);
logger.info("异步查询 _data表 第"+i+"次,获取到的数据:"+ listEx.size()+">>>");
} catch (Exception e) {
logger.info("异步线程调用失败", e);
}
return listEx;
});
listAll.addAll(list.get());
}
logger.info("myTask执行结束,共计查询数据:"+listAll.size()+"条...");
return listAll;
}
我理解的,线程销毁后,线程内部创建的对象也会跟着销毁,不会占用太多gc资源。
网友评论