标签:使用 long 线程 LocalDateTime 序列号 now 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。