当分页查询数据缓慢时,可将list列表数据和查询总量分别创建相应的线程去操作,最后汇总返回
不多说,直接上代码
//下面代码是同一个类中,线程类使用的是内部类
//汇总查询结果
public Map<String,Object> getSearchData(Pager pager, ZzxtSyrkCzrk zzxtSyrkHjrk, HjrkCon hjrkCon) throws Exception{
long start = System.currentTimeMillis();
CyclicBarrier cb = new CyclicBarrier(3);//跑2个线程,但创建是要多一个主线程,也可以成为守护线程
//查询列表数据的线程
CzrkSearchListThread czrkSearchListThread = new CzrkSearchListThread(pager,zzxtSyrkHjrk,hjrkCon,cb);
Thread czrkList = new Thread(czrkSearchListThread);
//查询数据总量的线程
CzrkSearchTotalThread czrkSearchTotalThread = new CzrkSearchTotalThread(zzxtSyrkHjrk,hjrkCon,cb);
Thread total = new Thread(czrkSearchTotalThread);
total.start();//开启线程
czrkList.start();//开启线程
cb.await();//等待所有的线程都到达后再执行下面的操作
//获取线程中的数据
Map<String,Object> map = new ConcurrentHashMap<>();
map.put("rows",czrkSearchListThread.getZzxtSyrkCzrkList());
map.put("total",czrkSearchTotalThread.getTotal());
System.out.println("haoshi=========" + (System.currentTimeMillis() - start));
return map;
}
//查询数据列表的线程
class CzrkSearchListThread implements Runnable{
private ZzxtSyrkCzrk zzxtSyrkHjrk;
private HjrkCon hjrkCon;
private Pager pager;
CyclicBarrier cb;
private List<ZzxtSyrkCzrk> zzxtSyrkCzrkList;
public CzrkSearchListThread(Pager pager, ZzxtSyrkCzrk zzxtSyrkHjrk, HjrkCon hjrkCon,CyclicBarrier cb){
this.zzxtSyrkHjrk = zzxtSyrkHjrk;
this.hjrkCon = hjrkCon;
this.pager = pager;
this.cb = cb;
}
@Override
public void run() {
zzxtSyrkCzrkList = ZzxtSyrkCzrkService.this.getMulZzxtSyrkCzrk(pager,zzxtSyrkHjrk,hjrkCon);
try {
cb.await();//告诉主线程已经到达任务点,即处理完了。
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
public List<ZzxtSyrkCzrk> getZzxtSyrkCzrkList(){
return zzxtSyrkCzrkList;
}
}
//数据总量的线程
class CzrkSearchTotalThread implements Runnable{
private ZzxtSyrkCzrk zzxtSyrkHjrk;
private HjrkCon hjrkCon;
private int total;
CyclicBarrier cb;
public CzrkSearchTotalThread(ZzxtSyrkCzrk zzxtSyrkHjrk, HjrkCon hjrkCon,CyclicBarrier cb){
this.zzxtSyrkHjrk = zzxtSyrkHjrk;
this.hjrkCon = hjrkCon;
this.cb = cb;
}
@Override
public void run() {
total = ZzxtSyrkCzrkService.this.getTotal(zzxtSyrkHjrk,hjrkCon);
try {
cb.await();//告诉主线程已经到达任务点,即处理完了
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
public int getTotal(){
return total;
}
}