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