并发多线程及限流的例子

例子1

ForkJoinPool forkJoinPool = new ForkJoinPool(10,
                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
                null,
                true);
        
        List list = new ArrayList();
        try {
            forkJoinPool.submit(() ->
                    list.parallelStream().forEach(e->{
                        System.out.println(e);
            })).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

 

例子2

package com.qinqiu.repository;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;

@Slf4j
public class Test {

    public static void main(String [] args){
        List<Integer> test = new ArrayList<>();
        test.add(1);
        test.add(2);

        ExecutorService executor = Executors.newFixedThreadPool(10);
        List<CompletableFuture<Integer>> futures = test.stream()
                .map(t -> CompletableFuture.supplyAsync(() -> test(t), executor))
                .collect(Collectors.toList());

        List<Integer> result =
                futures.stream()
                        .map(CompletableFuture::join)
                        .collect(Collectors.toList());

        log.info("result into:{}", JSON.toJSONString(result));
    }

    private static Integer test(Integer integer){
        log.info("test enter into this:{}", integer);
        return integer;
    }
}

 

redis限流

    // 这个不准
/* private static final String LIMIT_LUA_1 = "" +
"local is_exists = redis.call(\"EXISTS\", KEYS[1])\n" +
"if is_exists == 1 then\n" +
" if redis.call(\"INCR\", KEYS[1]) > tonumber(ARGV[1]) then\n" +
" return 0\n" +
" else\n" +
" return 1\n" +
" end\n" +
"else\n" +
" redis.call(\"SET\", KEYS[1], 1)\n" +
" redis.call(\"EXPIRE\", KEYS[1], ARGV[2])\n" +
" return 1\n" +
"end";*/




private static final String LIMIT_LUA = "local limit = tonumber(ARGV[1])\n" + "local expire_time = ARGV[2] \n" + "local result = redis.call('SETNX',KEYS[1],1); \n" + "if result == 1 then\n" + " redis.call('expire',KEYS[1],expire_time)\n" + " return 1\n" + "else\n" + " if tonumber(redis.call(\"GET\", KEYS[1])) >= limit then\n" + " return 0\n" + " else\n" + " redis.call(\"INCR\", KEYS[1])\n" + " return 1\n" + " end\n" + "end"; /** * IP限流 * * @param key * @param limit * @param timeout * @return * @throws IOException */ public boolean accessLimit(String key, int limit, int timeout) { List<String> keys = Collections.singletonList(key); List<String> argv = Arrays.asList(String.valueOf(limit), String.valueOf(timeout)); Long result = redisTemplate.execute((RedisCallback<Long>) connection -> { Object nativeConnection = connection.getNativeConnection(); //分集群和单机模式(JedisCluster 和 Jedis的eval方法没有共同父接口) if (nativeConnection instanceof JedisCluster) { return (Long) ((JedisCluster) nativeConnection).eval(LIMIT_LUA, keys, argv); } else if (nativeConnection instanceof Jedis) { return (Long) ((Jedis) nativeConnection).eval(LIMIT_LUA, keys, argv); } return 0L; }); System.out.println(key + "," + result); return 1 == result; }

 

 

应用实战

  @Test
    void baiduExpressQueryTrace() {
        int count = 0;

        ForkJoinPool forkJoinPool = new ForkJoinPool(5,
                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
                null,
                true);
        List<String> list = new ArrayList();
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");
        list.add("JDVC11867842730");


        while (true) {
            try {
                forkJoinPool.submit(() ->
                        list.parallelStream().forEach(e -> {
                            System.out.println(e);
                            BaseTraceSearchDTO baseTraceSearchDTO = new BaseTraceSearchDTO();
                            List<String> wayBillNos = new ArrayList<>();
                            wayBillNos.add(e);
                            baseTraceSearchDTO.setWayBillNos(wayBillNos);
                            baiDuCommonService.queryWaybillTrace(baseTraceSearchDTO);

                        })).get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }


      /*  try {
            String waybillNo = "JDVC11867842730";
            String expressCompanyCode = "";
            BaseExpressRequestEntity<String> requestEntity = new BaseExpressRequestEntity<>();
            requestEntity.setParam(waybillNo);
            BaiDuInfo baiDuInfo = baiDuAbility.queryWaybillTrace(requestEntity, expressCompanyCode);
            log.info("{},从百度获取物流轨迹:{}", count, baiDuInfo == null ? "null" : JSON.toJSONString(baiDuInfo.getContext()));
            BaseTraceSearchDTO baseTraceSearchDTO = new BaseTraceSearchDTO();
            List<String> wayBillNos = new ArrayList<>();
            wayBillNos.add(waybillNo);
            baseTraceSearchDTO.setWayBillNos(wayBillNos);
            baiDuCommonService.queryWaybillTrace(baseTraceSearchDTO);
            log.info("{}", JSON.toJSONString(list));
            count++;
        } catch (Exception ex) {
            log.error("异常", ex);
        }*/


    }

 

posted @ 2021-12-28 17:40  三人成虎  阅读(141)  评论(0)    收藏  举报