其他分享
首页 > 其他分享> > LocalDateTime 与 CountDownLatch 使用

LocalDateTime 与 CountDownLatch 使用

作者:互联网

1.LocalDateTime

  1. 获取当前时间 LocalDateTime.now()
  2. 获取当前时间毫秒值 LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)
  3. 设置指定格式 LocalDateTime.now().format(DateTimeFormatter.ofPattern("格式"))
点击查看代码
/定义初始时间
    private static final long BEGIN_TIMESTAMP = 974704080;
    //定义序列号的长度
    private static final int SERIAL_NUMBER_LENGTH = 32;


    //定义生成 ID 的方法
    public long nextId(String prefixKey) {
        //1.定义时间戳,记录从当前时间减去某一个起始时间的时间差值。
        LocalDateTime now = LocalDateTime.now();
        long nowSeconds = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp = nowSeconds - BEGIN_TIMESTAMP;
        //2.定义 key (生成的序列号)并存入 redis 设置自增
        String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        String key = "icr" + ":" + prefixKey + ":" + date;
        long count = stringRedisTemplate.opsForValue().increment(key);
        //3.拼接并返回 时间戳向左移动序列号的长度把低位让出来,再与序列号或运算
        long id = timestamp << SERIAL_NUMBER_LENGTH | count;
        return id;

2.CountDownLatch

  1. 创建 new CountDownLatch(个数)
  2. 在任务对象(Runnable)中调用 countDown 方法 减少锁存器的计数,如果计数达到零,则释放所有等待线程。如果当前计数大于零,则递减。如果新计数为零,则重新启用所有等待线程以进行线程调度。
  3. 将任务对象添加到线程池中运行,运行完调用 await 导致当前线程等待直到锁存器倒计时到零,或者被 interrupt 打断继续运行。
点击查看代码
        CountDownLatch latch = new CountDownLatch(500);
        Runnable task = ()->{
            for (int i = 0; i < 100; i++) {
                long id = redisIdWorker.nextId("order");
                System.out.println("id = " + id);
            }
            latch.countDown();
        };
        long beginTime = System.currentTimeMillis();
        for (int i = 0; i < 500; i++) {
            executor.submit(task);
        }
        latch.await();
        long afterTime = System.currentTimeMillis();
        System.out.println(afterTime - beginTime);
    }

标签:使用,long,线程,LocalDateTime,序列号,now,CountDownLatch
来源: https://www.cnblogs.com/xy7112/p/16436184.html