Producter And Consumer

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;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			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 block
			System.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;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			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 block
			System.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 stub
		Products<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 block
			e.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;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			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 block
			System.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;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			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 block
			System.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;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			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 block
			System.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;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			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 block
			System.out.println("Consumer interrupted");
		}
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值