天天看點

java多線程查詢_java使用多線程及分頁查詢資料量很大的資料

調用方法: import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class QueryTest { @Autowired Object myService; public List> getMaxResult(String sex) throws Exception{ long start = System.currentTimeMillis(); List> result=new ArrayList<>();//傳回結果 int count = 20000005;//mydao.getCount(); 通過count查到資料總量 int num = 10000;//每次查詢的條數 //需要查詢的次數 int times=count / num; if(count!=0) { times=times+1; } //開始查詢的行數 int bindex = 0; List>>> tasks = new ArrayList>>>();//添加任務 for(int i = 0; i >> qfe = new ThredQuery(myService,sex,bindex, num); tasks.add(qfe); bindex=bindex+num; } //定義固定長度的線程池 防止線程過多 ExecutorService execservice = Executors.newFixedThreadPool(15); List>>> futures = execservice.invokeAll(tasks); // 處理線程傳回結果 if (futures != null && futures.size() > 0) { for(Future>> future : futures) { result.addAll(future.get()); } } execservice.shutdown(); // 關閉線程池 long end = System.currentTimeMillis(); System.out.println("用時"+(start-end)); return result; } }

線程類: import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; public class ThredQuery implements Callable>> { private Object myService;//需要通過夠早方法把對應的業務service傳進來 實際用的時候把類型變為對應的類型 private String sex;//查詢條件 根據條件來定義該類的屬性 private int bindex;//分頁index private int num;//數量 public ThredQuery(Object myService,String sex,int bindex,int num){ this.myService=myService; this.sex=sex; this.bindex=bindex; this.num=num; } @Override public List> call() throws Exception { //通過service查詢得到對應結果 List> list =new ArrayList<>(); //myService.queryBySex(sex,bindex,num); return list; } }