Chciałbym stworzyć pewnego rodzaju aplikacji wątku Producer/Consumer
. Ale nie jestem pewien, jaki jest najlepszy sposób wdrożenia kolejki między tymi dwoma.Produktu/wątki konsumenckie za pomocą kolejki
Więc mam parę pomysłów (oba mogą być całkowicie błędne). Chciałbym wiedzieć, który byłby lepszy i jeśli oboje będą ssać, to jaki byłby najlepszy sposób wdrożenia kolejki. Chodzi mi głównie o moją implementację kolejki w tych przykładach. Rozszerzam klasę kolejki, która jest klasą wewnętrzną i jest bezpieczna dla wątków. Poniżej znajdują się dwa przykłady z 4 klasami każdy.
główna wykładowa
public class SomeApp
{
private Consumer consumer;
private Producer producer;
public static void main (String args[])
{
consumer = new Consumer();
producer = new Producer();
}
}
Consumer wykładowa
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
}
}
}
Producent wykładowa
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());
}
}
}
Kolejka wykładowa
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();
}
}
LUB
główna wykładowa
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);
}
}
Consumer wykładowa
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
}
}
}
Producent wykładowa
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());
}
}
}
Kolejka wykładowa
//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();
}
}
Idź!
Producenci skolączkowani i konsumenci piszą, przy okazji. Nie vice versa .. –
Och i nie zaczynaj wątków od konstruktora !! Wątek ten mógł obserwować obiekt w niespójnym stanie. Aby uzyskać szczegółowe informacje, zapoznaj się z częścią "Współbieżność Java w praktyce". –
Dzięki Zwei, ta kolejka sprawiła, że byłem nieostry. zaczynając wątek od rzeczy konstruktora powinien raczej uruchomić metodę intiliazation i rozpocząć go tam, czy powinien on uruchomić go z głównej klasy metody? – Gareth