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

mac2022-06-30  93

/**

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

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

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

*/

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()); } }}

转载于:https://www.cnblogs.com/harry-Consonance/p/6531934.html

最新回复(0)