我想实现一个监视器队列,两个不相关的线程可以共享它。在这种情况下仅使用ConcurrentLinkedQueue
还是应该以不同的方式使用它?我想实现Active Object Design Pattern并且有ActivationQueue - 它是普通的Java队列,必须作为监视器对象实现,因为它是由模式的其他组件添加到队列中。
答案 0 :(得分:0)
如果您需要线程安全Queue
,ConcurrentLinkedQueue
就足够了,但如果您需要线程安全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;
}
}
);
}
}