搜尋

首頁  >  問答  >  主體

java - 在for循环里使用多线程查询数据库

黄舟黄舟2770 天前1019

全部回覆(1)我來回復

  • 高洛峰

    高洛峰2017-04-18 10:39:57

    其實如果你是因為每個查詢任務都比較慢,所以想採用這種方式,不如去優化一下sql。或者你可以用下面的這種線程池的方式來處理,不過程式碼的複雜度會大大提高的。
    Futrue回傳的包裝的資料類型對應你sql回傳的類型
    或是你可以使用fork/join來處理

    public class CallableAndFuture {
        
        public static void main(String[] args) {
            ExecutorService threadPool = Executors.newSingleThreadExecutor();
            List<Future<Integer>> futures = new ArrayList<>();
            for (int i = 10; i < 15; i++) {
                futures.add(threadPool.submit(new Task(i)));
            }
            try {
                Thread.sleep(1000);// 可能做一些事情
    
                int allSum = 0;
                for (Future<Integer> f : futures) {
                    int fsum = f.get();
                    System.out.println("sum:" + fsum);
                    allSum += fsum;
                }
                System.out.println("allSum:" + allSum);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            threadPool.shutdown();
        }
    }
    
    
    class Task implements Callable<Integer> {
        private int i;
    
        public Task(int i) {
            this.i = i;
        }
    
        @Override
        public Integer call() throws Exception {
            // 替换成db的查询
            int sum = 0;
            for (int j = 0; j <= i; j++) {
                sum += j;
            }
            return sum;
        }
    
    }

    回覆
    0
  • 取消回覆