`
yaoweinan
  • 浏览: 139722 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

多线程模拟生产销售

    博客分类:
  • j2se
 
阅读更多

模拟公司仓库、生产、销售的过程

package cn.thread;

/**
 * 公司
 * @author 姚伟楠
 *
 */
public class Company {

 /**
  *
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Company com=new Company();
  com.produte();
  com.sale();
 }
 private Storage storage=new Storage();//公司仓库
 private  int producer_num=5;//公司生产线人数
 private  int saler_num=3;//公司销售人数
 private int produce_internal=2*1000;//每间隔2秒一个人可以生产一个产品
 /**
  * 生产
  */
 public void produte(){
  // TODO 找一定数量人员开始生产产品
  for(int i=0;i<producer_num;i++){
   new Producer((long) i,"No."+i+"Pro") {
    public  void producte() {
     synchronized(Producer.class){//防止编号大的产品比编号小的产品早放在仓库
     while(true){
      try {
       Thread.currentThread().sleep(produce_internal);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      Good good=new Good();
      synchronized (storage) {
       while (!(storage.getNumOfGood()<storage.getStorage_size())) {
        //仓库已满,进入等待
        try {
         storage.wait();
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       }
       storage.putGood(good);
       System.out.println(this.getName()+"生产"+good.getXh()+"号产品,仓库剩余"+storage.getNumOfGood()+"物品");
       storage.notify();
      }
     }
     }
    }
   }.start();
  }
 }
 public void sale(){
  // TODO 找一定数量的人员来销售产品
  for(int i=0;i<saler_num;i++){
    new Saler((long) i,"No."+i+"Saler") {
    public void sale() {
     while(true){
      try {
       Thread.currentThread().sleep((long)(10000* Math.random()));
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      synchronized (storage) {
       while (storage.getNumOfGood()<1) {//仓库无货物,进入等待
        try {
         storage.wait();
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       }
       Good good=storage.getGood();
       System.out.println(this.getName()+"销售"+good.getXh()+"号产品,仓库剩余"+storage.getNumOfGood()+"物品");
       storage.notify();
      }
     }
    }
   }.start();
  }
 }
 
}

 


仓库类

 package cn.thread;

import java.util.Stack;

/**
 * 仓库类
 *
 * @author 姚伟楠
 *
 */
public class Storage {
 private final Stack<Good> store = new Stack<Good>();
 private final int storage_size=100;
 /**
  * 放入货物
  *
  * @param good
  */
 public void putGood(Good good) {
   store.push(good);
 }

 /**
  * 拿出货品
  *
  * @return
  */
 public Good getGood() {
   Good good=store.pop();
   return good;
 }
 /**
  * 获得仓库中货品数量
  * @return
  */
 public int getNumOfGood(){
  return store.size();
  
 }

 /**
  * 获得仓库大小
  * @return
  */
 public int getStorage_size() {
  return storage_size;
 }
 
}

生产者类

package cn.thread;

/**
 * 生产者,生产者生产对象不明确,定义为抽象类,具有抽象的生产方法
 *
 * @author 姚伟楠
 *
 */
public abstract class Producer implements Runnable {
 private Long id;// 生产者编号
 private String name;// 生产者名称
 private Thread thread=new Thread(this);//单独生产
 public Producer(Long id, String name) {
  super();
  this.id = id;
  this.name = name;
 }

 public Long getId() {
  return id;
 }

 public void setId(Long id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 /**
  * 生产物品
  */
 public abstract void producte();

 @Override
 public void run() {
  producte();
 }
 /**
  * 开始生产
  */
 public void start(){
  thread.start();
 }
 /**
  * 停止生产
  */
 public void stop(){
  thread.stop();
 }
}

 

销售者类

package cn.thread;

/**
 * 销售员,由于未知此售货员销售的是哪个仓库的货物,所以此处销售对象不明确,定义为抽象方法
 * @author 姚伟楠
 *
 */
public abstract class Saler implements Runnable{
 private Long id; //售货员编号
 private String name;//名称
 private Thread thread=new Thread(this);//单独销售
 /**
  * 销售物品
  */
 public abstract void sale();
 public Saler(Long id, String name) {
  super();
  this.id = id;
  this.name = name;
 }
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 @Override
 public void run() {
  sale();
 }
 /**
  * 开始销售
  */
 public void start(){
  thread.start();
 }
 /**
  * 停止销售
  */
 public void stop(){
  thread.stop();
 }
}

 

物品类

package cn.thread;

/**
 * 物品类
 * @author 姚伟楠
 *
 */
public class Good {
 public static Long xh_icreate=0L;
 private  String xh;//物品流水号
 public Good() {
  xh=this.format(++xh_icreate);
 }
 /**
  * 格式化产品编号为16位数字
  * @param long1
  * @return
  */
 private String format(Long long1) {
  String tmp=long1+"";
  int length=tmp.length();
  while(18-length>0){
   tmp="0"+tmp;
   length=tmp.length();
  }
  return tmp;
 }
 public String getXh() {
  return xh;
 }
 
}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    线程描述生产与销售关系

    这样,通过队列的阻塞特性,可以自然地实现生产者-消费者模式,使得生产与销售在多线程环境下协同工作,而无需显式地进行线程同步。 同时,为了保证系统的高效率,我们需要合理地调度线程。例如,可以设置生产线程...

    多线程与程序集

    在给定的描述中,“模拟生产、入库、销售多线程实现”是一个实际的应用示例,这通常指的是在业务系统中,通过创建不同的线程来模拟真实的生产、库存管理和销售流程。每个线程可能负责一个特定的任务,如一个线程处理...

    JavaSE多线程三PPT教案学习.pptx

    - **Producer类**:代表生产者,实现`Runnable`接口,创建一个生产者线程,持续调用`Clerk`对象的`addProduct()`方法,模拟生产产品。 - **Consumer类**:代表消费者,同样实现`Runnable`接口,创建一个消费者线程...

    JAVA学习[借鉴].pdf

    这是一个经典的多线程同步问题,生产者负责生产面包,消费者负责消费。生产者和消费者必须协调工作,当仓库为空时,生产者需要等待;当仓库满时,消费者需要等待。在Java中,我们可以使用`wait()`和`notify()`方法...

    2019年山东枣庄市中心血站现通过市人事局招聘模拟试题及答案解析.docx

    - **应用场景**:进程的概念对于软件开发人员非常重要,尤其是在编写多线程应用时,理解进程间通信和同步机制可以帮助他们设计出更加高效、可靠的程序。 **3. “黄金水道”——长江** - **知识点**:地理知识 - **...

    wait和notifyAll方法的使用示例

    ### 使用wait和notifyAll方法详解 ...在生产者消费者模型等多线程应用场景中,它们能够有效地控制线程之间的交互,确保程序的正确性和效率。此外,合理的同步机制设计对于提高系统的并发性能至关重要。

    库存管理系统

    6. 多线程:在大型库存系统中,可能需要同时处理多个入库或出库操作,C#的多线程技术可以提高并发处理能力,提升系统性能。 库存管理的关键功能模块: 1. 入库管理:记录新到货物品的信息,包括供应商、数量、日期...

    【小家java】JUC并发编程之:虚假唤醒以及推荐的解决方案.docx

    在Java并发编程中,尤其是在处理多线程同步时,一个重要的概念是“虚假唤醒”(Spurious Wakeup)。这是一种较为罕见的现象,但在实际开发过程中仍然值得高度关注。虚假唤醒指的是,在没有其他线程调用`notify()`...

    java开发案例

    - **多线程处理**:在处理大量数据时,采用多线程技术提高系统响应速度。 - **安全性保障**:实现用户权限管理和数据加密传输,保护敏感信息。 - **异常处理**:通过完善的异常捕获和日志记录机制,确保系统的...

    BookManager

    - **多线程**:如果系统需要并行处理多个任务,如同时处理多个用户的请求,Java的多线程技术将派上用场。 4. **设计模式的应用** - **工厂模式**:用于创建对象,提供统一的接口,避免直接实例化具体类。 - **...

    电子行业周报:NXP收购Marvell无线业务,LGD广州OLED量产在即.pdf

    电子行业周报内容还涉及多份行业研究报告,包括液晶面板供需平衡、内存库存状况、IC设计企业税务优惠、SID2019会议报道、集成电路税收优惠延续以及模拟IC厂商排名等内容。这些报告为读者提供了电子行业的多方面分析...

    模拟技术中的风河与Cavium Networks共同推出高级多核设备调试解决方案

    2. 无缝开发多线程应用。 3. 精确同步多核启动和停止,便于定位程序问题。 4. 利用系统模式(System Mode)调试功能,实时监控多核运行的软件交互。 5. 通过JTAG加速器技术提高多核调试时的JTAG带宽,加快开发和分析...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    GE:数字化转型手册.pdf

    6. **软件即服务(SaaS)**:GE提倡构建软件服务能力,包括产品管理、工程设计、销售和营销等多个环节,强调服务的订阅和交付模式,以满足客户不断变化的需求。 7. **数据和连接的基础设施**:数据被视为新的生产要素...

    springboot471基于协同过滤算法商品推荐系统pf.zip

    这可能涉及缓存策略、批处理更新、并行计算等技术,例如使用Redis进行缓存,或者利用多线程和分布式计算提升计算速度。 8. **测试与评估**: 系统应包含单元测试和集成测试,确保各个组件的正确性。推荐效果的评估...

    职称计算机应用能力考试题(县以下初级).pdf

    双核是利用超线程技术实现的**:超线程技术与双核技术不同,它是在一个物理核心上通过硬件模拟出多个逻辑核心的技术,而双核则是指真正的物理核心数量。 - **C.双核就是指CPU 上集成两个运算核心**:这是对双核技术...

    HP COMPAQ D248商用台式机

    HP在生产过程中对PC进行了严格的检验和多年实际负载模拟测试,以确保在整机的生命周期内性能稳定并保持较低的维护成本。此外,该机型还兼容数百个经过认证的现有组件,使其能够在现有网络环境中无缝集成。 惠普为D...

    Cookiemania:Cookie项目

    6. **多线程**:为了实现并行处理,如同时处理多个顾客请求,应用可能会使用多线程技术。 7. **文件I/O**:保存和加载游戏进度可能涉及到读写文件,如XML、JSON或自定义格式。 8. **异常处理**:为了确保程序的...

Global site tag (gtag.js) - Google Analytics