Producter And Consumer

来源:互联网 发布:知乎 关于毛泽东的书 编辑:程序博客网 时间:2024/05/22 06:11
package mypack;import java.util.LinkedList;public class Products<T> {private int MAX_SIZE=100;private LinkedList<T> products=new LinkedList<T>();public boolean isFull(){return products.size()==MAX_SIZE;}public boolean isEmpty(){return products.isEmpty();}public boolean addEnable(int num){return products.size()+num<MAX_SIZE?true:false;}public boolean getEnable(int num){return products.size()>num;}    public T getProduct(){    return products.remove();    }    public void addProduct(T e){    products.add(e);    }}

用 wait() 和notify() notifyAll()实现

package mypack;public class Producter implements Runnable {private Products<Integer> products;private int num;public Producter(Products<Integer> p) {products = p;}public void setNum(int n) {num = n;}@Overridepublic void run() {// TODO Auto-generated method stubtry {while (true) {synchronized (products) {while (!products.addEnable(num))products.wait();for (int i = 0; i < num; i++) {System.out.print(i + "  ");products.addProduct(i);}System.out.println("已生产品的个数为" + num);products.notifyAll();}}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Producter interrupted");}}}
package mypack;public class Consumer implements Runnable {private int num;private Products<Integer> products;public Consumer(Products<Integer> p) {products = p;}public void setNum(int n) {num = n;}@Overridepublic void run() {// TODO Auto-generated method stubtry {while (true) {synchronized (products) {while (!products.getEnable(num)) products.wait();for (int i = 0; i < num; i++)System.out.print(products.getProduct() + "  ");System.out.println("消费者消费产品的个数为" + num);products.notifyAll();}}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Consumer interrupted");}}}

package mypack;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubProducts<Integer> products=new Products<>();ExecutorService exec = Executors.newCachedThreadPool();Producter p1 = new Producter(products);p1.setNum(15);Producter p2 = new Producter(products);p2.setNum(5);Producter p3 = new Producter(products);p3.setNum(10);Consumer c1 = new Consumer(products);c1.setNum(20);Consumer c2 = new Consumer(products);c2.setNum(5);exec.execute(p1);exec.execute(p2);exec.execute(p3);exec.execute(c1);exec.execute(c2);try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}exec.shutdownNow();}}

运用lock 和Condition  Test不变

</pre><pre name="code" class="java">package mypack;import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Products<T> {private ReentrantLock lock=new ReentrantLock();private  Condition full=lock.newCondition();private  Condition empty=lock.newCondition();private int MAX_SIZE=100;private LinkedList<T> products=new LinkedList<T>();public boolean isFull(){return products.size()==MAX_SIZE;}public boolean isEmpty(){return products.isEmpty();}public boolean addEnable(int num){return products.size()+num<MAX_SIZE?true:false;}public boolean getEnable(int num){return products.size()>num;}    public T getProduct(){    return products.remove();    }    public void addProduct(T e){    products.add(e);    }    public void lockProducts(){    lock.lock();    }    public void unlockProducts(){    lock.unlock();    }    public void fullWait() throws InterruptedException{    full.await();    }    public void fullSingal(){    full.signalAll();    }    public void emptyWait() throws InterruptedException{    empty.await();    }    public void emptySinal(){    empty.signalAll();    }    }

package mypack;public class Producter implements Runnable {private Products<Integer> products;private int num;public Producter(Products<Integer> p) {products = p;}public void setNum(int n) {num = n;}@Overridepublic void run() {// TODO Auto-generated method stubtry {while (true) {try{products.lockProducts();while (!products.addEnable(num))products.fullWait();for (int i = 0; i < num; i++) {System.out.print(i + "  ");products.addProduct(i);}System.out.println("已生产品的个数为" + num);products.emptySinal();}finally{products.unlockProducts();}}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Producter interrupted");}}}

package mypack;public class Consumer implements Runnable {private int num;private Products<Integer> products;public Consumer(Products<Integer> p) {products = p;}public void setNum(int n) {num = n;}@Overridepublic void run() {// TODO Auto-generated method stubtry {while (true) {try{products.lockProducts();while (!products.getEnable(num)) products.emptyWait();for (int i = 0; i < num; i++)System.out.print(products.getProduct() + "  ");System.out.println("消费者消费产品的个数为" + num);products.fullSingal();}finally{products.unlockProducts();}}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Consumer interrupted");}}}

用阻塞队列LinkedBlockingQueue

package mypack;import java.util.concurrent.LinkedBlockingQueue;public class Products<T> {private int MAX_SIZE=100;private LinkedBlockingQueue<T> products=new LinkedBlockingQueue<>(MAX_SIZE);public boolean isFull(){return products.size()==MAX_SIZE;}public boolean isEmpty(){return products.isEmpty();}public boolean addEnable(int num){return products.size()+num<MAX_SIZE?true:false;}public boolean getEnable(int num){return products.size()>num;}    public T getProduct() throws InterruptedException{    return products.take();    }    public void addProduct(T e) throws InterruptedException{    products.put(e);    }}
package mypack;public class Producter implements Runnable {private Products<Integer> products;private int num;public Producter(Products<Integer> p) {products = p;}public void setNum(int n) {num = n;}@Overridepublic void run() {// TODO Auto-generated method stubtry {while (true) {for (int i = 0; i < num; i++) {System.out.print(i + "  ");products.addProduct(i);}System.out.println("已生产品的个数为" + num);}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Producter interrupted");}}}

package mypack;public class Consumer implements Runnable {private int num;private Products<Integer> products;public Consumer(Products<Integer> p) {products = p;}public void setNum(int n) {num = n;}@Overridepublic void run() {// TODO Auto-generated method stubtry {while (true) {for (int i = 0; i < num; i++)System.out.print(products.getProduct() + "  ");System.out.println("消费者消费产品的个数为" + num);}} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Consumer interrupted");}}}





0 0