日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

序列号生成器

發布時間:2024/8/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 序列号生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*** 生成序列號,最大值為MAX_VAL。如果達到MAX_VAL,從0開始。*/ public class SerialGenerator {public static final int MAX_VAL = 999;public static final int R_NUM = getRNum(MAX_VAL);private static AtomicReference<AtomicInteger> ref = new AtomicReference<AtomicInteger>(new AtomicInteger(0));public static int getSerialNo() {AtomicInteger old = ref.get();int serialNo = old.getAndIncrement();while (serialNo > MAX_VAL) {AtomicInteger update = new AtomicInteger(0);ref.compareAndSet(old, update);old = ref.get();serialNo = old.getAndIncrement();}return serialNo;}/*** 求整數有幾位,如234是3位。* @param i* @return*/private static final int getRNum(int i) {if (i < 0) {throw new RuntimeException("Illegal arg i, i=" + i);}int div = i;int num = 1;div /= 10;while (div > 0) {div /= 10;num++;}return num;}/*** 獲取序列號,該序列號為字符串表示,長度固定為序列號的最大長度,* 如果長度不足,則在前面補0,比如"015"* @return*/public static String getSerialNoInStr() {int serialNo = getSerialNo();int rnum = getRNum(serialNo);StringBuilder sb = new StringBuilder();for (int i=0; i<R_NUM-rnum; i++) {sb.append("0");}return sb.append(serialNo).toString();}@Testpublic static void main(String[] args) throws InterruptedException, ExecutionException {//測10次for (int t=0; t<10; t++) {int taskNum = 1 + new Random().nextInt(19);@SuppressWarnings("unchecked")Future<Integer>[] fs = new Future[taskNum]; // System.err.println(taskNum);ExecutorService executor = Executors.newFixedThreadPool(taskNum);for (int i=0; i<taskNum; i++) {fs[i] = executor.submit(new Callable<Integer>() {int sum = 0;@Overridepublic Integer call() throws Exception {for (int i=0; i<=MAX_VAL; i++) {sum += getSerialNo();}return new Integer(sum);} });}int result = 0;for (Future<Integer> future : fs) {result += future.get();}int expect = 0;for (int i=0; i<taskNum; i++) {for (int j=0; j<=MAX_VAL; j++) {expect += j;}}Assert.assertEquals(expect, result);System.out.println(taskNum + " : " + expect);}Random random = new Random();for (int i=0; i<10000; i++) {getSerialNoInStr();if (random.nextInt(1000) < 9) {System.out.println(getSerialNoInStr());} } }}

?

總結

以上是生活随笔為你收集整理的序列号生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。