xuhy
6 天以前 07d0d74e8db1d9e536fdfe33b80c568ccfc7febe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.ruoyi.jianguan.util;
 
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
 
public class SequenceGenerator {
    private final ConcurrentHashMap<Long, AtomicInteger> counterMap = new ConcurrentHashMap<>();
 
    public synchronized String getNextSequence() {
        long currentTimestamp = System.currentTimeMillis() / 1000; // 获取当前秒级时间戳
 
        AtomicInteger counter = counterMap.get(currentTimestamp);
        if (counter == null) {
            counter = new AtomicInteger(1); // 新的一秒,初始化计数器为1
            counterMap.put(currentTimestamp, counter);
        } else {
            counter.incrementAndGet(); // 同一秒内,计数器递增
        }
 
        // 生成四位序列号
        String sequence = String.format("%04d", counter.get());
 
        return sequence;
    }
 
    public static void main(String[] args) {
        SequenceGenerator generator = new SequenceGenerator();
 
        // 测试生成多个序列号
        for (int i = 0; i < 10; i++) {
            System.out.println(generator.getNextSequence());
            try {
                Thread.sleep(100); // 模拟同一秒内的多次调用
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
 
        // 模拟进入新的一秒
        try {
            Thread.sleep(1100); // 等待超过1秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        // 再次生成序列号
        for (int i = 0; i < 10; i++) {
            System.out.println(generator.getNextSequence());
            try {
                Thread.sleep(100); // 模拟同一秒内的多次调用
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}