导读
由于项目需要,需要根据时间进行生成对应的批次,之前写了个线程不安全的,后面弃用,改为以下的。
使用
方式一
public class Test {
/**
*批次号生成(NEW)
**/
private static final AtomicInteger CODE = new AtomicInteger(0);
private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS");
private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai");
public static String generateBatchNo(){
LocalDateTime dataTime = LocalDateTime.now(ZONE_ID);
if(CODE.intValue()>9990){
CODE.getAndSet(0);
}
return dataTime.format(DF_FMT_PREFIX)+CODE.getAndIncrement();
}
/** 测试 **/
public static void main(String[] args) {
List<String> orderNos = Collections.synchronizedList(new ArrayList<String>());
IntStream.range(0,8000).parallel().forEach(i->{
orderNos.add(generateBatchNo());
});
List<String> filterOrderNos = orderNos.stream().distinct().collect(Collectors.toList());
System.out.println("生成批次数:"+orderNos.size());
System.out.println("过滤重复后批次数:"+filterOrderNos.size());
System.out.println("重复批次数:"+(orderNos.size()-filterOrderNos.size()));
}
}
END
参考:线程并发不重复订单编号生成
搞定~