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
相关推荐
- Java顺序查找、二分查找
- Java冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序
- jvm:字节码(字节码角度分析a++与--a)
- 数据库连接池:Durid(执行流程、工具类)
- java:面向接口编程(解耦)
- jvm:字节码执行流程
- jvm:类文件结构(魔数、版本、常量池)
- HashMap:源代码(构造方法、put、resize、get、remove、replace)
- 多线程:生产者消费者(管程法、信号灯法)
- 多线程:锁(死锁、Lock锁、线程池)
- 多线程:(synchronized方法、synchronized块、JUC)
- 多线程:线程不安全案例(买票、银行取钱、集合)
- 多线程:(优先级、守护线程)
- 多线程(线程的状态、终止、休眠、礼让、合并)
- 多线程:多线程的应用(网图下载、模拟售票、龟兔赛跑)
- jvm调优(新生代、老年代调优)