之前我們已經(jīng)用常用方法寫(xiě)了一個(gè)消費(fèi)者與生產(chǎn)者程序,不過(guò)看上去有點(diǎn)煩。在JDK 5里面,Java為我們提供了一個(gè)可以簡(jiǎn)化這方面開(kāi)發(fā)的的接口
java.util.concurrent.BlockingQueue
使用BlockingQueue,我們的程序可以這樣寫(xiě)
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);// 將消費(fèi)者的睡眠時(shí)間設(shè)置得比生產(chǎn)者小是為了演示當(dāng)產(chǎn)品列表為空的情形

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

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

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

}

這個(gè)是消費(fèi)者類(lè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++;
}

}

這個(gè)是生產(chǎn)者類(lè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();
}
// 當(dāng)然這個(gè)類(lèi)還有其他的方法需要實(shí)現(xiàn),為了清楚起見(jiàn),我把使用默認(rèn)實(shí)現(xiàn)的方法都去掉了。
}

我們定義一個(gè)Queue來(lái)實(shí)現(xiàn)BlockingQueue。下面我們來(lái)測(cè)試下
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();
}

}

看到?jīng)]有,就這么簡(jiǎn)單,以很少的邏輯代碼實(shí)現(xiàn)了消費(fèi)者與生產(chǎn)者功能,當(dāng)然你還可以對(duì)他進(jìn)行擴(kuò)充,讓他更加完善。
---------------------------------------------------------
專(zhuān)注移動(dòng)開(kāi)發(fā)
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2007-04-28 12:11
TiGERTiAN 閱讀(2411)
評(píng)論(4) 編輯 收藏 所屬分類(lèi):
Java