根据时间戳生成有序id (菜鸟版)
代码
@Slf4j public class NumUtil { private static long tmpID = 0; private static final long LOCK_TIME = 1; private static final long INCREASE_STEP = 1; private static SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmssSSS"); private static final Lock LOCK = new ReentrantLock(); public static long nextPkId() throws InterruptedException { //当前:(年、月、日、时、分、秒、毫秒) long timeCount; if (LOCK.tryLock(LOCK_TIME, TimeUnit.SECONDS)) { timeCount = Long.parseLong(sdf.format(new Date())); try { if (tmpID < timeCount) { tmpID = timeCount; } else { tmpID += INCREASE_STEP; timeCount = tmpID; } return timeCount; } finally { LOCK.unlock(); } } else { log.error("lock failed"); return nextPkId(); } } }
测试
public static void numTest() { ExecutorService executorService = Executors.newCachedThreadPool(); int n = 10000; List<Long> list = new ArrayList<>(); CountDownLatch latch = new CountDownLatch(n); for (int i = 0; i < n; i++) { executorService.execute(() -> { //执行业务请求 try { list.add(NumUtil.nextPkId()); } catch (InterruptedException e) { e.printStackTrace(); } latch.countDown(); }); } try { // 一定记得加上timeout时间,防止阻塞主线程 latch.await(3000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { log.error(e.getMessage()); } //4.等待所有子任务完成,组装内容 while (list.size() < n) { log.info("集合长度 >>> {}",list.size()); } //5.关闭线程池 executorService.shutdown(); for (Long aLong : list) { System.out.println(aLong); } }
浙公网安备 33010602011771号