鍍金池/ 問(wèn)答/Java  iOS/ java代碼并發(fā)操作咨詢(xún)

java代碼并發(fā)操作咨詢(xún)

需求

分頁(yè)查詢(xún)數(shù)據(jù)列表的時(shí)候同時(shí)查詢(xún)總條數(shù) 想并發(fā)查詢(xún) 但是感覺(jué)下面的代碼有點(diǎn)繁瑣 有沒(méi)更簡(jiǎn)便的方式 或者有什么第三方框架能夠簡(jiǎn)化類(lèi)似這樣的邏輯

    ExecutorService executorService = Executors.newFixedThreadPool(2);
    CountDownLatch countDownLatch = new CountDownLatch(2);
    Map<String, Object> map = new HashMap<>();
    // 一個(gè)線程查記錄數(shù)
    executorService.submit(() -> {
        List<Integer> data = Lists.newArrayList(1, 2, 3);
        map.put("data", data);
        countDownLatch.countDown();
    });
    // 一個(gè)線程查總條數(shù)
    executorService.submit(() -> {
        int count = 10;
        map.put("count", count);
        countDownLatch.countDown();
    });

    countDownLatch.await();
    
    System.out.println(map);
回答
編輯回答
毀憶

HashMap是非線程安全的,你這樣用一定會(huì)有問(wèn)題的。不清楚你要達(dá)到的目標(biāo)是什么,至少?gòu)纳厦娴睦由蟻?lái)看,多線程不但沒(méi)有必要,還引入了新的問(wèn)題。說(shuō)說(shuō)你的具體應(yīng)用場(chǎng)景,也許在特定場(chǎng)景下你的想法是合適的。

2017年12月4日 06:33
編輯回答
敢試

一種簡(jiǎn)便的方案

        CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
            List<Integer> data = Lists.newArrayList(1, 2, 3);
            return data;
        }).thenAcceptBoth(CompletableFuture.supplyAsync(() -> 10), (d, c) -> {
            Map<String, Object> map = new HashMap<>();
            map.put("data", d);
            map.put("count", c);
            System.out.println(map);
        });
        future.get();
2018年1月24日 17:10