我想創建某種Producer/Consumer
線程應用程序。但我不確定在兩者之間實現隊列的最佳方式。使用隊列的生產者/消費者線程
所以我有兩個想法(這可能是完全錯誤的)。我想知道哪個更好,如果他們都吸了,那麼實施隊列的最好方法是什麼。這主要是我在這些例子中執行的隊列,我很關心。我正在擴展一個Queue類,它是一個內部類,並且是線程安全的。下面是兩個例子,每個例子有4個類。
主要類 -
public class SomeApp
{
private Consumer consumer;
private Producer producer;
public static void main (String args[])
{
consumer = new Consumer();
producer = new Producer();
}
}
消費者接收機類
public class Consumer implements Runnable
{
public Consumer()
{
Thread consumer = new Thread(this);
consumer.start();
}
public void run()
{
while(true)
{
//get an object off the queue
Object object = QueueHandler.dequeue();
//do some stuff with the object
}
}
}
生產者接收機類
public class Producer implements Runnable
{
public Producer()
{
Thread producer = new Thread(this);
producer.start();
}
public void run()
{
while(true)
{
//add to the queue some sort of unique object
QueueHandler.enqueue(new Object());
}
}
}
隊列接收機類
public class QueueHandler
{
//This Queue class is a thread safe (written in house) class
public static Queue<Object> readQ = new Queue<Object>(100);
public static void enqueue(Object object)
{
//do some stuff
readQ.add(object);
}
public static Object dequeue()
{
//do some stuff
return readQ.get();
}
}
OR
主要類 -
public class SomeApp
{
Queue<Object> readQ;
private Consumer consumer;
private Producer producer;
public static void main (String args[])
{
readQ = new Queue<Object>(100);
consumer = new Consumer(readQ);
producer = new Producer(readQ);
}
}
消費者接收機類
public class Consumer implements Runnable
{
Queue<Object> queue;
public Consumer(Queue<Object> readQ)
{
queue = readQ;
Thread consumer = new Thread(this);
consumer.start();
}
public void run()
{
while(true)
{
//get an object off the queue
Object object = queue.dequeue();
//do some stuff with the object
}
}
}
生產者接收機類
public class Producer implements Runnable
{
Queue<Object> queue;
public Producer(Queue<Object> readQ)
{
queue = readQ;
Thread producer = new Thread(this);
producer.start();
}
public void run()
{
while(true)
{
//add to the queue some sort of unique object
queue.enqueue(new Object());
}
}
}
隊列接收機類
//the extended Queue class is a thread safe (written in house) class
public class QueueHandler extends Queue<Object>
{
public QueueHandler(int size)
{
super(size); //All I'm thinking about now is McDonalds.
}
public void enqueue(Object object)
{
//do some stuff
readQ.add();
}
public Object dequeue()
{
//do some stuff
return readQ.get();
}
}
去吧!
生產者enqueue和消費者出隊,順便說一句。反之亦然.. – 2010-02-25 08:22:25
哦,不要從構造函數中啓動線程!該線程可以觀察處於不一致狀態的對象。有關詳細信息,請參閱「Java併發實踐」。 – 2010-02-25 08:24:12
謝謝Zwei,入隊的事情是我沒有專注。從構造函數的東西開始線程我應該運行一個intiliazation方法,並在那裏啓動它,或者它應該從主方法類啓動它? – Gareth 2010-02-25 09:05:29