• 多线程模拟 客户-购买产品过程


    /**

    一个同学问我多线程安全问题具体怎么操作

    这是个多线程安全模拟实例 

    多线程模拟 客户-购买产品过程

    */

    public class ThreadTest {
    public static void main(String[] args) {
    /**
    * 新建一个列队
    */
    Queue q=new Queue();
    //初始化产品
    Product p=new Product(q);
    //客户购买产品
    Consumer c=new Consumer(q);
    p.start();
    c.start();
    }
    }

    /**
    * 重写Queue
    * @author Administrator
    *
    */
    class Queue {
    // 产品:这里则为产品号码
    int value;

    // 是否有产品
    boolean isvalid = false;

    /**
    * 这里 声明一个put方法去实现 客户购买产品过程
    * 这里需要用同步的方法,避免执行到一半中断
    * isvalid=true 表示还产品存在
    */
    public synchronized void put(int i) {
    if (!isvalid) {
    value = i;
    isvalid = true;
    notify();
    }
    try{//如果isvalid=true,这时候执行wait()方法等待
    wait();//该方法会跑出异常需要捕获
    }catch(Exception e){
    e.printStackTrace();
    }
    }

    /**
    * 客户购买商品
    * 将产品从Queue中移除 及isvalid=false
    * @author Administrator
    *
    */
    public synchronized int get() {
    //如果isvalid=true 则说明有产品
    // 反之则没有产品,调用wait()方法等待
    if (!isvalid) {
    try {
    wait();// 该方法会跑出异常需要捕获
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    //客户购买成功之后,isvalid状态改变
    isvalid = false;
    notify();
    return value;
    }

    }

    /**
    * Product为产品 将数据库里的货物放在Queue中 这里的话放入1-10只是用来测试
    *
    * @author
    *
    */
    class Product extends Thread {

    Queue q;

    public Product(Queue q) {
    // TODO Auto-generated constructor stub
    this.q = q;
    }

    public void run() {
    /**
    * 将产品放入
    */
    for (int i = 1; i < 10; i++) {
    q.put(i);
    System.out.println("Product id: " + i);
    }

    }

    }

    /**
    * 客户购买商品
    *
    * @author Administrator
    *
    */
    class Consumer extends Thread {
    Queue q;

    public Consumer(Queue q) {
    // TODO Auto-generated constructor stub
    this.q = q;
    }

    public void run() {
    while (true) {
    System.out.println("Consumer get: " + q.get());
    }
    }
    }

    北上广深是个高节奏的生活,作为一个新人,很多时候我们都在感叹职位上老人的智慧。以前通过搜索引擎,80%的问题都有答案。那么现在我是觉得90%都会有答案。那么作为我们新人的的核心竞争力到底在哪里?
  • 相关阅读:
    XDOJ1156: 等待队列
    XDOJ 1009: Josephus环的复仇
    cookie浏览器编写测试无效???
    express框架中cookie的使用
    JS设置Cookie过期时间
    CSS 伪元素
    art-template手动编写时间过滤器
    mongoose设置默认值、模块化及性能测试
    Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify
    mongoose 联表查询之populate使用及注意事项
  • 原文地址:https://www.cnblogs.com/harry-Consonance/p/6531934.html
Copyright © 2020-2023  润新知