导读


由于项目需要,需要根据时间进行生成对应的批次,之前写了个线程不安全的,后面弃用,改为以下的。

使用


方式一

  1. public class Test {
  2. /**
  3. *批次号生成(NEW)
  4. **/
  5. private static final AtomicInteger CODE = new AtomicInteger(0);
  6. private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS");
  7. private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai");
  8. public static String generateBatchNo(){
  9. LocalDateTime dataTime = LocalDateTime.now(ZONE_ID);
  10. if(CODE.intValue()>9990){
  11. CODE.getAndSet(0);
  12. }
  13. return dataTime.format(DF_FMT_PREFIX)+CODE.getAndIncrement();
  14. }
  15. /** 测试 **/
  16. public static void main(String[] args) {
  17. List<String> orderNos = Collections.synchronizedList(new ArrayList<String>());
  18. IntStream.range(0,8000).parallel().forEach(i->{
  19. orderNos.add(generateBatchNo());
  20. });
  21. List<String> filterOrderNos = orderNos.stream().distinct().collect(Collectors.toList());
  22. System.out.println("生成批次数:"+orderNos.size());
  23. System.out.println("过滤重复后批次数:"+filterOrderNos.size());
  24. System.out.println("重复批次数:"+(orderNos.size()-filterOrderNos.size()));
  25. }
  26. }

END


参考:线程并发不重复订单编号生成
搞定~