为了让生成的订单号不重复,我们设计一个订单号生成器类来生成订单号: 订单号生成规则如下: 由年月日时分秒+3位数字组成,这4位数组从000开始编号,一直到999, 1秒内不能超过1000个订单。 在同一个秒内,这3位数字依次递增,不能重复,如果在同一秒内并发量很大,请求生成订单号超过1000个, 则程序需要把此秒给空耗过去,直到下一秒时,重新从000开始编号。如果编号没有超过999,即使时间进入到 另一个秒内,编号从上次的位置继续,不用从000开始。【算法请自行实现】public class OrderNoGenerator { //添加属性: private static int seq = 0; private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); /************** * @return 此方法返回唯一的订单编号 */ public static String generateNo() { //TODO 请自行实现 } }
时间: 2023-07-24 14:10:19 浏览: 251
好的,根据您的要求,我为您编写了一个订单号生成器类。您可以将其添加到您的项目中,然后调用其 generateNo() 方法来生成唯一的订单号。
```
import java.time.LocalDateTime;
import java.util.concurrent.atomic.AtomicInteger;
public class OrderNoGenerator {
private static final int MAX_SEQUENCE = 999;
private static final int MAX_PER_SECOND = 1000;
private static LocalDateTime lastDateTime = LocalDateTime.now();
private static AtomicInteger sequence = new AtomicInteger(0);
public static synchronized String generateNo() {
LocalDateTime currentDateTime = LocalDateTime.now();
if (currentDateTime.isAfter(lastDateTime)) {
lastDateTime = currentDateTime;
sequence.set(0);
}
if (sequence.get() >= MAX_SEQUENCE) {
try {
Thread.sleep(1000 - currentDateTime.getNano() / 1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lastDateTime = LocalDateTime.now();
sequence.set(0);
}
int currentSequence = sequence.incrementAndGet();
return lastDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + String.format("%03d", currentSequence);
}
}
```
这个订单号生成器类使用了 AtomicInteger 来保证在多线程环境下生成的订单号不重复。它会根据当前时间来生成订单号,并且在同一秒内保证订单号的唯一性。如果同一秒内生成的订单号数量超过了 1000,它会将当前线程睡眠到下一秒开始,然后重新从 000 开始编号。
阅读全文