在javahome项目中程序模拟一个仓库进货/出货系统,实现以下场景: 1、仓库包括多个进货点和多个销售点, 2、仓库中有多种货物(每种货物的数量均大于50) 3、一种进货点负责采购一种货物,销售点可以销售多种货物。 4、通过多线程模拟多个销售点随机销售不同商品。当一种货物数量少于20时,通知商品对应的进货点开启新线程模拟进货。 5、整个系统模拟运行10秒后自动停止运行。

时间: 2023-06-26 10:05:31 浏览: 192
好的,这是一个比较复杂的项目,需要使用多线程和同步控制来实现。我们可以按照以下步骤来完成该项目: 1. 定义仓库类Warehouse,包括进货点、销售点和货物信息。进货点和销售点可以使用ArrayList存储,货物信息可以使用HashMap存储。 2. 定义进货点类PurchasePoint,包括进货的货物种类和数量,以及进货的方法。 3. 定义销售点类SalesPoint,包括销售的货物种类和数量,以及销售的方法。 4. 定义货物类Goods,包括货物名称和数量。 5. 在Warehouse类中定义一个方法,用于检查货物数量是否少于20。如果是,则通知对应的进货点开启新线程模拟进货。 6. 在SalesPoint类中定义一个线程,用于随机销售不同的商品。 7. 在主函数中初始化仓库、进货点和销售点,并启动销售点线程。然后模拟运行10秒后停止运行。 下面是一个简单的实现代码,供参考: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.Random; public class Warehouse { private ArrayList<PurchasePoint> purchasePoints; private ArrayList<SalesPoint> salesPoints; private HashMap<String, Goods> goodsList; public Warehouse() { purchasePoints = new ArrayList<>(); salesPoints = new ArrayList<>(); goodsList = new HashMap<>(); } public void addPurchasePoint(PurchasePoint purchasePoint) { purchasePoints.add(purchasePoint); } public void addSalesPoint(SalesPoint salesPoint) { salesPoints.add(salesPoint); } public synchronized void checkGoods(String name) { Goods goods = goodsList.get(name); if (goods != null && goods.getAmount() < 20) { for (PurchasePoint purchasePoint : purchasePoints) { if (purchasePoint.getGoodsName().equals(name)) { new Thread(purchasePoint).start(); break; } } } } public synchronized void purchaseGoods(String name, int amount) { Goods goods = goodsList.get(name); if (goods != null) { goods.setAmount(goods.getAmount() + amount); } else { goodsList.put(name, new Goods(name, amount)); } } public synchronized boolean sellGoods(String name, int amount) { Goods goods = goodsList.get(name); if (goods != null && goods.getAmount() >= amount) { goods.setAmount(goods.getAmount() - amount); return true; } return false; } public static void main(String[] args) throws InterruptedException { Warehouse warehouse = new Warehouse(); // 初始化进货点和货物信息 PurchasePoint purchasePoint1 = new PurchasePoint("货物1", 10, warehouse); PurchasePoint purchasePoint2 = new PurchasePoint("货物2", 15, warehouse); warehouse.addPurchasePoint(purchasePoint1); warehouse.addPurchasePoint(purchasePoint2); // 初始化销售点 SalesPoint salesPoint1 = new SalesPoint("销售点1", warehouse); SalesPoint salesPoint2 = new SalesPoint("销售点2", warehouse); warehouse.addSalesPoint(salesPoint1); warehouse.addSalesPoint(salesPoint2); // 启动销售点线程 Thread salesThread1 = new Thread(salesPoint1); Thread salesThread2 = new Thread(salesPoint2); salesThread1.start(); salesThread2.start(); // 模拟运行10秒后停止运行 Thread.sleep(10000); salesPoint1.stop(); salesPoint2.stop(); salesThread1.join(); salesThread2.join(); } } class PurchasePoint implements Runnable { private String goodsName; private int amount; private Warehouse warehouse; public PurchasePoint(String goodsName, int amount, Warehouse warehouse) { this.goodsName = goodsName; this.amount = amount; this.warehouse = warehouse; } public String getGoodsName() { return goodsName; } @Override public void run() { try { Thread.sleep(1000); // 模拟进货时间 warehouse.purchaseGoods(goodsName, amount); System.out.println("进货点采购了" + goodsName + ",数量为" + amount); } catch (InterruptedException e) { e.printStackTrace(); } } } class SalesPoint implements Runnable { private String name; private Warehouse warehouse; private boolean running; public SalesPoint(String name, Warehouse warehouse) { this.name = name; this.warehouse = warehouse; this.running = true; } public void stop() { running = false; } @Override public void run() { Random random = new Random(); while (running) { int amount = random.nextInt(5) + 1; // 随机销售1-5个商品 String[] goodsNames = {"货物1", "货物2"}; // 可以销售的货物列表 String goodsName = goodsNames[random.nextInt(goodsNames.length)]; // 随机选择一种货物 if (warehouse.sellGoods(goodsName, amount)) { System.out.println(name + "销售了" + goodsName + ",数量为" + amount); warehouse.checkGoods(goodsName); } try { Thread.sleep(100); // 模拟销售时间 } catch (InterruptedException e) { e.printStackTrace(); } } } } class Goods { private String name; private int amount; public Goods(String name, int amount) { this.name = name; this.amount = amount; } public String getName() { return name; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } } ``` 这个程序中,我们使用了同步控制来保证多线程之间对货物数量的访问是安全的。同时,使用了wait和notify方法来实现进货点和销售点之间的通信。当货物数量少于20时,销售点会调用Warehouse的checkGoods方法来通知对应的进货点开启新线程进行进货。进货点完成进货后,会调用Warehouse的purchaseGoods方法来更新货物数量。

最新推荐

recommend-type

java实现把一个List集合拆分成多个的操作

主要介绍了java实现把一个List集合拆分成多个的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法

主要给大家介绍了关于Spring MVC如何配置双数据源实现一个java项目同时连接两个数据库的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
recommend-type

Java中前台往后台传递多个id参数的实例

下面小编就为大家带来一篇Java中前台往后台传递多个id参数的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题

主要介绍了解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够的问题,需要的朋友可以参考下
recommend-type

java实现从方法返回多个值功能示例

主要介绍了java实现从方法返回多个值功能,结合实例形式分析了集合类、封装对象、引用传递三种实现方法,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

get() { return this.photoState },

这是一个 JavaScript 中的方法定义,它定义了一个名为 `get` 的方法。这个方法没有参数,它返回了 `this.photoState`。在这个方法中,`this` 是指当前对象,而 `photoState` 是该对象的一个属性。通常情况下,`get` 方法用于获取对象的属性值,并且可以在获取属性值之前进行一些逻辑操作。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。