package pinx.thread;

 import java.util.LinkedList;
import java.util.Queue; public class ProducerConsumer { Storage storage=null;
Query query=null;
public ProducerConsumer(int max){
storage=new Storage(max);
query=new Query();
} public void start(){
Producter producter=new Producter();
Consumer consumer=new Consumer();
Thread thread1=new Thread(producter); Thread thread2=new Thread(consumer);
Thread thread3=new Thread(consumer);
Thread thread4=new Thread(consumer); thread1.start();
thread2.start();
thread3.start();
thread4.start();
} /**
* @param args
*/
public static void main(String[] args) {
ProducerConsumer pc=new ProducerConsumer(20);
pc.start();
} class Product {
private int id; public Product(int id) {
this.id = id;
} public String toString() {
return "Product " + this.id;
}
} class Query{
public Query(){}
public synchronized int get(){
return -1;
}
} class Storage {
Queue<Product> queue = null;
int max = 0; public Storage(int max) {
this.max = max;
this.queue = new LinkedList<Product>();
} public synchronized void push(Product product) {
while (this.max == this.queue.size()) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.queue.offer(product);
System.out.println("Producter has generated a product :"
+ product.toString());
this.notifyAll();
} public synchronized Product pop() {
while (this.queue.isEmpty()) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = this.queue.poll();
System.out.println("Consumer has consumed a product :"
+ product.toString()+" ~~~");
return product;
}
} class Consumer implements Runnable { public void run() {
while(true){
System.out.println(String.format("Producter get the query value : %d", query.get()));
storage.pop();
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} class Producter implements Runnable { public void run() {
int index=0;
while(true){
System.out.println(String.format("Producter get the query value : %d~~~~~~~~~~~~~~~~~~~", query.get()));
storage.push(new Product(++index));
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} }

最新文章

  1. 前端自动化工具 -- grunt 使用简介
  2. Jsp入门学习笔记
  3. Ruby操作Excel的方法与技巧大全
  4. IOS开发之上传APP
  5. 更改Activity亮度
  6. .net mvc HtmlHelper扩展使用
  7. Java中printStackTrace()、toString()、getMessage()的区别
  8. hdu 1728
  9. ios属性和成员变量写在.h文件和.m文件中 区别?
  10. 字符编码笔记:ASCII,Unicode和UTF-8(转)
  11. Hadoop 2:Mapper和Reduce
  12. css3 二级菜单
  13. 【洛谷P1376】机器工厂
  14. jdk动态代理 要把目标对象 和自己都传进去;以便自己对目标对象的代理
  15. sublime_Text3中snippet设置信息头(包括作者、日期)
  16. 深入__proto__和prototype的区别和联系
  17. HBASE+Solr实现详单查询--转
  18. oracle11.2 安装
  19. python2.7安装Twisted报Microsoft Visual C++9.0 required
  20. Http调试工具-Fiddler使用指引

热门文章

  1. Hunter’s Apprentice(判断所走路线为顺时针或逆时针)【Green公式】
  2. centos7搭建EFK
  3. rust 学习之旅二,关键字和保留字
  4. mongoDB的基本使用方法
  5. 重识Java8函数式编程
  6. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展
  7. script写在head与写在body中的区别
  8. SpringBoot--日期格式化
  9. C++的新手入门答疑
  10. return ,continue,break的用法与区别总结