LocalDateTime 与 CountDownLatch 使用
作者:互联网
1.LocalDateTime
- 获取当前时间 LocalDateTime.now()
- 获取当前时间毫秒值 LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)
- 设置指定格式 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
- 创建 new CountDownLatch(个数)
- 在任务对象(Runnable)中调用 countDown 方法 减少锁存器的计数,如果计数达到零,则释放所有等待线程。如果当前计数大于零,则递减。如果新计数为零,则重新启用所有等待线程以进行线程调度。
- 将任务对象添加到线程池中运行,运行完调用 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