使用队列的生产者/使用者线程

使用队列的生产者/使用者线程

我想创造一些Producer/Consumer线程应用程序。但我不知道在两者之间实现队列的最佳方式是什么。

所以我有两个想法(这两个想法都可能是完全错误的)。我想知道哪一个更好,如果两者都很糟糕,那么实现队列的最佳方法是什么。我关心的主要是这些例子中队列的实现。我正在扩展一个队列类,它是一个内部类,并且是线程安全的。下面是两个例子,每个例子有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();
    }}

主修班-

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


莫回无
浏览 374回答 3
3回答

UYOU

Java 5+拥有您所需的所有此类工具。你会想:把你所有的制片人放在一起ExecutorService;把你所有的消费者都放在另一个ExecutorService;如果有必要,使用BlockingQueue.我为(3)说“如果有必要”,因为根据我的经验,这是不必要的一步。您所做的就是向使用者执行器服务提交新任务。因此:final&nbsp;ExecutorService&nbsp;producers&nbsp;=&nbsp;Executors.newFixedThreadPool(100);final&nbsp;ExecutorService&nbsp;consumers&nbsp;=&nbsp;Executors.newFixedThreadPool(100);while&nbsp;(/*&nbsp;has&nbsp;more&nbsp;work&nbsp;*/)&nbsp;{ &nbsp;&nbsp;producers.submit(...);}producers.shutdown();producers.awaitTermination(Long.MAX_VALUE,&nbsp;TimeUnit.NANOSECONDS);consumers.shutdown();consumers.awaitTermination(Long.MAX_VALUE,&nbsp;TimeUnit.NANOSECONDS);所以producers直接提交consumers.

幕布斯7119047

你在重新发明方向盘。如果需要持久化和其他企业特性,请使用JMS(我建议ActiveMq).如果您需要内存中的快速队列,可以使用java的一种影响排队.如果您需要支持Java1.4或更早版本,请使用DougLea的优秀并发包裹。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java