找回密碼
 立即註冊
搜索
熱搜: SQL C# AI F1
查看: 717|回復: 0

[Java] 根據訂單號碼上鎖 java根據時間產生訂單編號

[複製鏈接]
灌水成績
725
3
111764
主題
回帖
積分

等級頭銜

積分成就 威望 : 999
貢獻 : 999
金錢 : 108039
精華 : 0
在線時間 : 332 小時
最後登錄 : 2026-5-5

豐功偉業

分享
分享 分享到Facebook

好康介紹

準備中
發表於 2023-12-8 14:56:40 | 顯示全部樓層 |閱讀模式
琪琪小站免責聲明
本論壇仍是開放式討論平台,本論壇對於所有討論的真實性、完整性及立場等,不負任何法律責任。
而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。
於有關情形下,用戶應尋求專業意見 (如涉及醫療、法律或投資等問題)。
由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。
kikishop有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。
切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。
本網站保留一切法律權利。
  1. package skdapp.cn.stream.common.generator;

  2. import java.time.Instant;
  3. import java.util.HashSet;
  4. import java.util.Objects;
  5. import java.util.Set;
  6. import java.util.UUID;
  7. import java.util.concurrent.Callable;
  8. import java.util.concurrent.ExecutionException;
  9. import java.util.concurrent.FutureTask;
  10. import java.util.concurrent.ThreadLocalRandom;
  11. import java.util.concurrent.atomic.AtomicInteger;

  12. import org.apache.commons.lang3.time.FastDateFormat;
  13. import org.springframework.util.StopWatch;

  14. /**
  15.   * 訂單編號策略
  16.   *
  17.   * @project common-utils
  18.   * @fileName ODDGenerator.java
  19.   * @Description
  20.   * @author
  21.   * @date 2023年12月08日
  22.   * @version 1.0.0
  23.   */
  24. public abstract class ODDGenerator {
  25.      private static final FastDateFormat pattern = FastDateFormat.getInstance("yyyyMMddHHmmss");
  26.      private static final AtomicInteger atomicInteger = new AtomicInteger(1);
  27.      private static ThreadLocal<StringBuilder> threadLocal = new ThreadLocal<StringBuilder>();

  28.      /**
  29.       * 長碼產生策略
  30.       * 20201116114351753590384993
  31.       * @param lock uuid
  32.       * @return
  33.       */
  34.      public static String getC(String lock) {
  35.          if (Objects.isNull(threadLocal.get())) {
  36.              lock = Objects.isNull(lock) ? UUID.randomUUID().toString() : lock;
  37.              StringBuilder builder = new StringBuilder(pattern.format(Instant.now().toEpochMilli()));// 取系統目前時間作為訂單編號前半部分
  38.              builder.append(Math.abs(lock.hashCode()));// HASH-CODE
  39.              builder.append(atomicInteger.getAndIncrement());// 自增順序
  40.              threadLocal.set(builder);
  41.          }
  42.          return threadLocal.get().toString();
  43.      }

  44.      /**
  45.       * 短碼產生策略
  46.       * 1307891882965
  47.       * @param lock
  48.       * @return
  49.       */
  50.      public static String getD(String lock) {
  51.          if (Objects.isNull(threadLocal.get())) {
  52.              lock = Objects.isNull(lock) ? UUID.randomUUID().toString() : lock;
  53.              StringBuilder builder = new StringBuilder(ThreadLocalRandom.current().nextInt(0, 999)); // 隨機數
  54.              builder.append(Math.abs(lock.hashCode()));// HASH-CODE
  55.              builder.append(atomicInteger.getAndIncrement());// 自增順序
  56.              threadLocal.set(builder);
  57.          }
  58.          return threadLocal.get().toString();
  59.      }

  60.      /**
  61.       * 1000個線程並發測試
  62.       *
  63.       * @param args
  64.       * @throws InterruptedException
  65.       * @throws ExecutionException
  66.       */
  67.      public static void main(String[] args) throws InterruptedException, ExecutionException {
  68.          Set<String> set = new HashSet<String>();
  69.          FutureTask<String> task = null;
  70.          StopWatch watchTime = new StopWatch();
  71.          watchTime.start();
  72.          for (int i = 0; i < 1000; i++) {
  73.              Callable<String> callable = new Callable<String>() {
  74.                  @Override
  75.                  public String call() throws Exception {
  76.                      // System.out.println("目前執行緒:>>>>> ".concat(Thread.currentThread().getId()+""));
  77.                      //return getC(null);
  78.                      return getD(null);
  79.                  }
  80.              };
  81.              task = new FutureTask<String>(callable);
  82.              new Thread(task).start();
  83.              set.add(task.get());
  84.              System.out.println(task.get());
  85.          }
  86.          watchTime.stop();
  87.          System.out.println(watchTime.getTotalTimeMillis());
  88.          System.out.println(set.size());
  89.      }
  90. }
複製代碼


琪琪小站免責聲明
本論壇仍是開放式討論平台,本論壇對於所有討論的真實性、完整性及立場等,不負任何法律責任。
而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。
於有關情形下,用戶應尋求專業意見 (如涉及醫療、法律或投資等問題)。
由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。
kikishop有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。
切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。
本網站保留一切法律權利。
FengLeo Internet Multimedia Services WorkStation
*********************************************************
Genie
WebUrl:https://www.fengleo.com/
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|Ki Ki Shop |網站地圖

GMT+8, 2026-5-6 09:43 , Processed in 0.086672 second(s), 21 queries .

Powered by FengLeo X3.5

© 2020-2025 Fengleo.com

快速回復 返回頂部 返回列表