这个java阻塞队列变种可能吗?

时间:2015-03-12 08:48:58

标签: java multithreading thread-safety blockingqueue

以下的痤疮是我的想法:
- 2个主题,1个制作人,1个消费者
- T1创建队列并启动下一个线程,并且可以将元素放入队列

ServerThread implements Runnable{

    run(){
        BlockingQueue q = new ArrayBlockingQueue(1024);
        ListenerThread lt = new ListenerThread8(q);
        lt.start();

        ....

        q.put(message);

    }
}

-T2将等待队列中的元素并处理它们

ListenerThread implements Runnable{
        ...
        run(){
            while(run){
               if(!q.isEmpty){
                    sendMessage(q.getfirst());
               }else{
                    sleep(1000);
               }
            }
        }
   }

这只是我想如何实现我的部分程序的伪实现 - 这个工作吗?
- 这可以使用队列中的静态修饰符吗?

1 个答案:

答案 0 :(得分:2)

这是生产者 - 消费者的自然模式,所以是的,这将起作用。

顺便说一下 - 你不需要检查队列是否为空 - 你只需要调用take,它会等到有东西出现。

class Thing {
}

class ServerThread implements Runnable {

    @Override
    public void run() {
        BlockingQueue<Thing> q = new ArrayBlockingQueue<>(1024);
        ListenerThread lt = new ListenerThread(q);
        new Thread(lt).start();

        q.put(message);

    }
}

class ListenerThread implements Runnable {

    volatile boolean run;
    private final BlockingQueue<Thing> q;

    public ListenerThread (BlockingQueue<Thing> q) {
        this.q = q;
    }

    @Override
    public void run() {
        while (run) {
            try {
                sendMessage(q.take());
            } catch (InterruptedException ex) {
                run = false;
            }
        }
    }
}

您不需要排队static

我建议的唯一调整是不在服务器run方法中创建监听器。服务器应该尽可能少地了解消费者。队列,服务器和消费者都应该在其他地方创建和链接。