/**
一个同学问我多线程安全问题具体怎么操作
这是个多线程安全模拟实例
多线程模拟 客户-购买产品过程
*/
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