之前我們已經用常用方法寫了一個消費者與生產者程序,不過看上去有點煩。在JDK 5里面,Java為我們提供了一個可以簡化這方面開發的的接口
java.util.concurrent.BlockingQueue
使用BlockingQueue,我們的程序可以這樣寫
import java.util.concurrent.BlockingQueue;


public class ConsumerBlockingQueue extends Thread
{

private final BlockingQueue<Integer> queue;
private final String name;
public ConsumerBlockingQueue(BlockingQueue<Integer> q, String name)

{
queue=q;
this.name=name;
}

public void run()
{
// TODO Auto-generated method stub
try

{
while(true)

{
consume(queue.take());
try

{
sleep(800);// 將消費者的睡眠時間設置得比生產者小是為了演示當產品列表為空的情形

}catch(Exception e)
{
e.printStackTrace();
}
}

}catch(Exception e)
{
e.printStackTrace();
}
}
private void consume(int i)

{
System.out.println(name+" consume "+i);
}

}

這個是消費者類。

public class ProducerBlockingQueue extends Thread
{
private final BlockingQueue<Integer> queue;
private final String name;
private static int i=0;
public ProducerBlockingQueue(BlockingQueue<Integer> q, String name)

{
queue=q;
this.name=name;
}

public void run()
{
// TODO Auto-generated method stub
try

{
while(true)

{
queue.add(produce());
try

{
sleep(1000);

}catch(Exception e)
{
e.printStackTrace();
}
}

}catch(Exception e)
{
e.printStackTrace();
}

}
private int produce()

{
System.out.println(name+" producing "+i);
return i++;
}

}

這個是生產者類。
import java.util.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;


public class Queue implements BlockingQueue
{

private List list=new ArrayList();

public boolean add(Object o)
{
// TODO Auto-generated method stub
list.add(o);
return true;
}


public Object take() throws InterruptedException
{
// TODO Auto-generated method stub

while(isEmpty())
{}
return list.remove(0);
}



public boolean isEmpty()
{
// TODO Auto-generated method stub
return list.isEmpty();
}
// 當然這個類還有其他的方法需要實現,為了清楚起見,我把使用默認實現的方法都去掉了。
}

我們定義一個Queue來實現BlockingQueue。下面我們來測試下
import java.util.concurrent.BlockingQueue;



public class Test
{


/** *//**
* @param args
*/

public static void main(String[] args)
{
// TODO Auto-generated method stub
BlockingQueue<Integer> q=new Queue();
ProducerBlockingQueue p=new ProducerBlockingQueue(q,"p");
ProducerBlockingQueue p1=new ProducerBlockingQueue(q,"p1");
ConsumerBlockingQueue c=new ConsumerBlockingQueue(q,"c");
ConsumerBlockingQueue c1=new ConsumerBlockingQueue(q,"c1");
p.start();
p1.start();
c.start();
c1.start();
}

}

看到沒有,就這么簡單,以很少的邏輯代碼實現了消費者與生產者功能,當然你還可以對他進行擴充,讓他更加完善。
---------------------------------------------------------
專注移動開發
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2007-04-28 12:11
TiGERTiAN 閱讀(2411)
評論(4) 編輯 收藏 所屬分類:
Java