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();
}
}
}
}
}
Producter and Consumer
未经允许不得转载:搜云库技术团队 » Producter and Consumer
相关推荐
- 第二版:互联网大厂面试题,92份 PDF,累计 3625 页!
- 蘑菇街、滴滴、淘宝、微信的组件化架构解析,附Demo和PDF
- Mybatis源码分析 - 九种设计模式总结
- MySQl性能优化,MySQl索引优化,MySQl执行计划使用实战经历
- 如何设计网址短链接生成服务,网址缩短服务,短URL生成服务
- Nginx实现负载均衡配置,分发策略
- JVM最多支持多少个线程?如何计算JVM线程数?
- 程序该如何优化?怎么做性能优化?性能优化的原则?
- SpringBoot Jar 可执行原理,源码分析SpringBoot Jar启动
- 为什么要读源码,如何阅读源码,Spring源码如何读,业务源代码如何读
- StringBuilder为什么线程不安全,StringBuilder源码分析
- JDK8 Stream 数据流效率分析,JDK8 Stream 性能如何
- 如何计算并发用户数,PV计算公式,TPS估计
- Tomcat性能调优,JVM的性能调优,总结文档
- 生产上MySQL慢查询优化实战,SQL优化实战
- SpringBoot 中 logback日志配置使用