在Java中处理同时出库和入库的订单号自动获取问题,通常涉及到多线程环境下的并发控制。为了确保订单号的唯一性和连续性,我们可以使用多种策略,如数据库的自增ID、分布式锁、或者利用Java的并发工具类如AtomicLong等。这里,我将提供一个基于AtomicLong的简单示例,适用于单机环境。

1.场景描述

假设我们有一个简单的库存管理系统,需要同时处理出库和入库操作,并且每个操作都需要一个唯一的订单号。我们将使用AtomicLong来生成这些订单号,因为它提供了线程安全的操作。

2.解决方案

(1)定义订单号生成器:使用AtomicLong来确保订单号的线程安全生成。

(2)模拟出库和入库操作:使用线程来模拟并发操作,每个线程在执行时都会从订单号生成器中获取一个唯一的订单号。

3.示例代码

import java.util.concurrent.atomic.AtomicLong;  

public class OrderNumberGenerator {
private static final AtomicLong orderIdGenerator = new AtomicLong(1); // 假设从1开始 // 线程任务,模拟出库或入库
static class OrderTask implements Runnable {
private final String type; // 出库或入库 public OrderTask(String type) {
this.type = type;
} @Override
public void run() {
long orderId = orderIdGenerator.incrementAndGet(); // 线程安全地获取下一个订单号
System.out.println(Thread.currentThread().getName() + " 执行 " + type + " 操作,订单号:" + orderId);
}
} public static void main(String[] args) {
// 创建并启动多个线程模拟并发操作
Thread t1 = new Thread(new OrderTask("出库"), "出库线程1");
Thread t2 = new Thread(new OrderTask("入库"), "入库线程1");
Thread t3 = new Thread(new OrderTask("出库"), "出库线程2");
Thread t4 = new Thread(new OrderTask("入库"), "入库线程2"); t1.start();
t2.start();
t3.start();
t4.start(); // 等待所有线程完成
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

4.说明

(1)AtomicLong:这是一个提供原子操作的long变量类,用于在多线程环境下生成唯一的订单号。

(2)线程任务OrderTask类实现了Runnable接口,用于模拟出库或入库操作。每个任务都会从orderIdGenerator中获取一个唯一的订单号。

(3)主函数:在main方法中,我们创建了四个线程来模拟并发操作,并启动了它们。使用join()方法等待所有线程完成,以确保主线程在输出所有订单号后结束。

5.注意事项

(1)如果系统需要处理分布式环境下的订单号生成,可能需要考虑使用数据库的自增ID、Redis的原子操作或分布式ID生成算法(如雪花算法Snowflake)等。

(2)在高并发场景下,AtomicLong的性能可能不是最优的,但对于简单的单机应用来说,它足够高效且易于实现。

6.完整的Java代码示例

该完整的Java代码示例展示了如何使用AtomicLong来在多线程环境中生成唯一的订单号。这个示例模拟了一个简单的库存管理系统中的出库和入库操作,每个操作都会从AtomicLong中获取一个唯一的订单号。

import java.util.concurrent.atomic.AtomicLong;  

// 线程任务类,用于模拟出库或入库操作
class OrderTask implements Runnable {
private final String type; // 出库或入库
private final AtomicLong orderIdGenerator; // 订单号生成器 public OrderTask(String type, AtomicLong orderIdGenerator) {
this.type = type;
this.orderIdGenerator = orderIdGenerator;
} @Override
public void run() {
// 线程安全地获取下一个订单号
long orderId = orderIdGenerator.incrementAndGet();
// 模拟出库或入库操作(这里只是打印信息)
System.out.println(Thread.currentThread().getName() + " 执行 " + type + " 操作,订单号:" + orderId);
}
} public class OrderSystem {
// 订单号生成器,假设从1开始
private static final AtomicLong orderIdGenerator = new AtomicLong(1); public static void main(String[] args) {
// 创建并启动多个线程模拟并发操作
Thread t1 = new Thread(new OrderTask("出库", orderIdGenerator), "出库线程1");
Thread t2 = new Thread(new OrderTask("入库", orderIdGenerator), "入库线程1");
Thread t3 = new Thread(new OrderTask("出库", orderIdGenerator), "出库线程2");
Thread t4 = new Thread(new OrderTask("入库", orderIdGenerator), "入库线程2"); // 启动所有线程
t1.start();
t2.start();
t3.start();
t4.start(); // 等待所有线程完成(可选,取决于你是否需要等待所有操作完成后再继续)
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (InterruptedException e) {
e.printStackTrace();
} // 如果不需要等待所有线程完成,可以省略上面的join调用
// ... 执行其他操作
}
}

在这个示例中,OrderTask类是一个实现了Runnable接口的线程任务,它接受一个操作类型(出库或入库)和一个AtomicLong实例作为订单号生成器。在run方法中,它首先从orderIdGenerator中获取一个唯一的订单号,然后模拟执行出库或入库操作(这里只是简单地打印了一条信息)。

OrderSystem类的main方法创建了四个线程,每个线程都执行一个不同的OrderTask实例。这些线程被启动后,将并发地执行出库或入库操作,并从orderIdGenerator中获取唯一的订单号。

注意,由于使用了AtomicLong,所以即使在多线程环境中,订单号的生成也是线程安全的,不需要额外的同步控制。

此外,main方法中的join调用是可选的,它用于等待所有线程完成。如果我们的应用程序在启动这些线程后不需要等待它们完成就可以继续执行其他操作,那么可以省略这些join调用。但是,在这个示例中,我保留了它们以展示如何等待所有线程完成。

Java如何解决同时出库入库订单号自动获取问题的更多相关文章

  1. Java代码生成16位纯数字的订单号

    //生成16位唯一性的订单号 public static void getUUID(){ //随机生成一位整数 int random = (int) (Math.random()*9+1); Stri ...

  2. oracle中的查询语句(关于出库入库信息表,明细表,把捆包箱表,单位信息表的集中查询)

    --查出所有现金中心的单位IDwith AllUnitas(select t.ORGANIZATIONID orgid,t.parentidfrom CDMS_ORGANIZATION t where ...

  3. java通过UUID生成16位唯一订单号

    import java.util.UUID; public class T { public static String getOrderIdByUUId() { int machineId = 1; ...

  4. Java JPA设置默认值、Timestamp设置、自动获取时间

    设置默认值 @Column(name="state",columnDefinition="tinyint default 0") private Integer ...

  5. HTML5 Canvas 绘制库存变化折线 画入库出库柱状图

    代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...

  6. SAP MM 并非奇怪现象之MB5B报表查不到某一笔出库记录?

    物料号:1301002696 工厂代码:2160 MB5B,如下查询条件, 查询结果中,期初与期末库存数量都是0,期间的出库入库数量都是0.事实上该物料期初应该是有库存的.并且我用MB51相同时间段查 ...

  7. 使用Jasperreporter生成入库出库单打印等报表操作

    项目需要打印报表:就是那种生成入库单,出库单等的操作.使用到的技术:使用iReport Designer5.1.0设计报表,使用struts2+jasperreporter生成最终填充数据的报表 首先 ...

  8. MySQL_产品昨日库存与历史入库历史出库成本_20161124

    产品昨日库存与历史入库历史出库成本 SELECT d.ID,a.*,e.昨日订单额 ,b.昨天入库额,b.历史2天,b.历史3天,b.历史4天,b.历史5天,b.历史6天,b.历史7天,b.历史8天, ...

  9. php解析入库跟出库

    转载:http://www.jb51.net/article/39092.htm 数据放入数据库和取出来显示在页面需要注意什么 入库时 $str=addslashes($str); $sql=\&qu ...

  10. 练习1:python设计停车入库出库系统

    前言: 最近在某个测试群看到有人抛出了一个面试题.为了提升自己的编程能力,我也尝试的用python去写了一下. 语言:python,数据库:sqlite  .菜鸟来袭,只是基本实现功能,可能没有考虑太 ...

随机推荐

  1. C练习_1005

    题自:题目 1009: [编程入门]数字的处理与判断_C语言网 题目描述 给出一个不多于5位的整数,要求 1.求出它是几位数 2.分别输出每一位数字 3.按逆序输出各位数字,例如原数为321,应输出1 ...

  2. python virtualenv虚拟环境配置与使用

    python virtualenv虚拟环境配置与使用 By:赖富玉 QQ:1033553122 概述 python开发过程中,我们可能需要同时开发多款应用,这些应用可能公用同一个版本的Python程序 ...

  3. AppiumDesktop控制手机和安卓模拟器

    前言: 本期内容 如何用AppiumDesktop连接安卓手机和安卓模拟器 AppiumDesktop基本参数的获取方法,及如何驱动安卓设备 AppiumDesktop在模拟登陆和爬虫中用到的基本功能 ...

  4. Hyperledger Fabric 2.x 环境搭建

    一.说明 区块链网络的核心是分布式账本,在这个账本中记录了网络中发生的所有交易信息. Hyperledger Fabric是一个是开源的,企业级的,带权限的分布式账本解决方案的平台.Hyperledg ...

  5. VScode配置PHP开发环境

    vscode配置php开发环境 使用vscode配置PHP开发环境,首先要下载vscode, vscode下载 下载完vscode之后,可以在扩展里面下载中文版本 将vscode下载完之后,需要下载x ...

  6. 【Vue】图片裁剪功能支持

    一.效果展示: 1.表单的图片上传项: - 新增时默认一个空白Input框 - 更新时展示以往上传存放的图片, - 点击[查看]浏览完整大小 - 点击[删除]清空src地址,重新上传新照片 2.裁剪框 ...

  7. Rust项目的代码组织

    学习一种编程语言时,常常优先关注在语言的语法和标准库上,希望能够尽快用上新语言来开发,我自己学习新的开发语言时也是这样. 不过,想用一种新的语言去开发实际的项目,或者自己做点小工具的话,除了语言本身之 ...

  8. 【转载】 关于tf.stop_gradient的使用及理解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u013745804/article/de ...

  9. 机器学习经典教材《模式识别与机器学习》,Pattern Recognition and Machine Learning,PRML官方开放免费下载

    微软剑桥研究院实验室主任Christopher Bishop的经典著作<模式识别与机器学习>,Pattern Recognition and Machine Learning,简称PRML ...

  10. 最新版gym-0.26.2下Atari环境的安装以及环境版本v0,v4,v5的说明

    强化学习的游戏仿真环境可以分为连续控制和非连续控制两类,其中连续控制的以mujoco为主,而非连续控制的以Atari游戏为主,本文对gym下的Atari环境的游戏环境版本进行一定的介绍. 参考:[转载 ...