生産者/消費者モデルJava実装方式
Javaを使用して生産者/消費者モデルを実現する方法:
wait()/notify()メソッド:
await()/signal()メソッド:ArrayBlockingQueueも2つのモニタキューを使用して実現されます.
BlockingQueueブロッキングキューメソッド:ブロッキングキューを使用して実装された消費者/生産者モード:put()メソッド:上の生産者スレッドと同様に、容量が最大に達したときに自動的にブロックされます.take()メソッド:上の消費者スレッドと同様に、容量が0の場合、自動的にブロックされます.
原文参照:
http://blog.csdn.net/monkey_d_meng/article/details/6251879/
1. wait()/notify()
2. await()/signal()
3. BlockingQueue
wait()/notify()メソッド:
public class Storage {
//
private final int MAX_SIZE=10;
//
private LinkedList
await()/signal()メソッド:ArrayBlockingQueueも2つのモニタキューを使用して実現されます.
public class Storage {
//
private final int MAX_SIZE=10;
//
private LinkedList list = new LinkedList();
private final Lock lock = new ReentrantLock();
//
private final Condition full = lock.newCondition();
//
private final Condition empty = lock.newCondition();
/**
* num
* @param num
*/
public void product(int num){
lock.lock();
while(list.size()+num>MAX_SIZE){
System.out.println("【 】:" + num + "\t【 】:"
+ list.size() + "\t !");
try {
full.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;inew Object());
}
System.out.println("【 】:" + num + "\t【 】:" + list.size());
//
empty.signalAll();
//
lock.unlock();
}
// num
public void consume(int num)
{
//
lock.lock();
//
while (list.size() < num)
{
System.out.println("【 】:" + num + "\t【 】:" + list.size()
+ "\t !");
try
{
// ,
empty.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
// , num
for (int i = 1; i <= num; ++i)
{
list.remove();
}
System.out.println("【 】:" + num + "\t【 】:" + list.size());
//
full.signalAll();
//
lock.unlock();
}
// get/set
public LinkedList getList()
{
return list;
}
public void setList(LinkedList list)
{
this.list = list;
}
public int getMAX_SIZE()
{
return MAX_SIZE;
}
}
BlockingQueueブロッキングキューメソッド:ブロッキングキューを使用して実装された消費者/生産者モード:put()メソッド:上の生産者スレッドと同様に、容量が最大に達したときに自動的にブロックされます.take()メソッド:上の消費者スレッドと同様に、容量が0の場合、自動的にブロックされます.
public class Storage {
//
private final int MAX_SIZE = 100;
//
private LinkedBlockingQueue list = new LinkedBlockingQueue(
100);
// num
public void produce(int num)
{
// 0
if (list.size() == MAX_SIZE)
{
System.out.println("【 】:" + MAX_SIZE + "/t !");
}
// , num
for (int i = 1; i <= num; ++i)
{
try
{
// ,
list.put(new Object());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("【 】:" + list.size());
}
}
// num
public void consume(int num)
{
//
if (list.size() == 0)
{
System.out.println("【 】:0/t !");
}
// , num
for (int i = 1; i <= num; ++i)
{
try
{
// ,
list.take();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println("【 】:" + list.size());
}
// set/get
public LinkedBlockingQueue getList()
{
return list;
}
public void setList(LinkedBlockingQueue list)
{
this.list = list;
}
public int getMAX_SIZE()
{
return MAX_SIZE;
}
}
原文参照:
http://blog.csdn.net/monkey_d_meng/article/details/6251879/