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

/**

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

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

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

*/

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%都会有答案。那么作为我们新人的的核心竞争力到底在哪里?
原文地址:https://www.cnblogs.com/harry-Consonance/p/6531934.html