Producteur/Consommateur threads à l'aide d'une File d'attente

J'aimerais créer une sorte de Producer/Consumer filetage app. Mais je ne suis pas sûr de ce que la meilleure façon de mettre en œuvre une file d'attente entre les deux.

J'ai donc quelques avec deux idées (qui peuvent être tout à fait tort). Je voudrais savoir qui serait le mieux et si les deux sucent alors quelle serait la meilleure façon de mettre en œuvre la file d'attente. C'est principalement ma mise en œuvre de la file d'attente dans ces exemples, que je suis préoccupé. Je suis de l'extension d'une classe de File d'attente qui est une maison de classe et est thread-safe. Ci-dessous deux exemples avec 4 classes de chacun.

Classe principale-

public class SomeApp
{
    private Consumer consumer;
    private Producer producer;

    public static void main (String args[])
    {
        consumer = new Consumer();
        producer = new Producer();
    }
} 

Classe de consommateur-

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
        }
    }
}

Producteur de la classe

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());
        }
    }
}

Classe de file d'attente-

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();
    }
}

OU

Classe principale-

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);
    }
} 

Classe de consommateur-

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
        }
    }
}

Producteur de la classe

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());
        }
    }
}

Classe de file d'attente-

//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();
    }
}

Et go!

  • Les producteurs de mettre en file d'attente et de la Consommation file d'attente, btw. Pas vice-versa..
  • Oh, et ne pas commencer le Fils d'un constructeur!! Ce thread a pu observer l'objet dans un état incohérent. Reportez-vous à "Java Simultanéité dans la Pratique" pour plus de détails..
  • Grâce Zwei, la mise en file d'attente était chose de moi d'être floue. départ le Fil de constructeur chose devrais-je plutôt exécuter une intiliazation méthode et de le démarrer, il ou devrait-il commencer à partir de la méthode main de la classe?
InformationsquelleAutor Gareth | 2010-02-25