监视队列 - ConcurrentLinkedQueue?

时间:2017-01-11 20:04:44

标签: java design-patterns data-structures collections monitor

我想实现一个监视器队列,两个不相关的线程可以共享它。在这种情况下仅使用ConcurrentLinkedQueue还是应该以不同的方式使用它?我想实现Active Object Design Pattern并且有ActivationQueue - 它是普通的Java队列,必须作为监视器对象实现,因为它是由模式的其他组件添加到队列中。

1 个答案:

答案 0 :(得分:0)

如果您需要线程安全QueueConcurrentLinkedQueue就足够了,但如果您需要线程安全BlockingQueue,则应使用LinkedBlockingQueue而不是像wikipedia上的模式Active Object的实现示例那样需要。

class OriginalClass {

    private double val = 0.0;

    void doSomething() {
        val = 1.0;
    }

    void doSomethingElse() {
        val = 2.0;
    }
}

class BecomeActiveObject {

    private double val = 0.0;

    private BlockingQueue<Runnable> dispatchQueue = new LinkedBlockingQueue<Runnable>();

    public BecomeActiveObject() {
        new Thread (new Runnable() {

                @Override
                public void run() {
                    while(true) {
                        try {
                            dispatchQueue.take().run();
                        } catch (InterruptedException e) {   
                            // okay, just terminate the dispatcher
                        }
                    }
                }
            }
        ).start();
    }

    //
    void doSomething() throws InterruptedException {
        dispatchQueue.put(new Runnable() {
                @Override
                public void run() { 
                    val = 1.0; 
                }
            }
        );
    }

    //
    void doSomethingElse() throws InterruptedException {
        dispatchQueue.put(new Runnable() {
                @Override
                public void run() { 
                    val = 2.0; 
                }
            }
        );
    }
}