如何让 BlockingQueue 接受多种类型?
How to make BlockingQueue to accept multiple types?
我有 class X
、class Y
和 class Z
。如果X
或Y
执行特定条件,则应将它们放入BlockingQueue
。 Class Z
直接从队列中取出。
我知道创建这样的东西:
BlockingQueue<X,Y> BQueue=new ArrayBlockingQueue<X,Y>(length);
是非法的。如何正确制作?
最简单的方法是让 BlockingQueue
接受任何对象类型:
BlockingQueue<Object> q = new ArrayBlockingQueue<>(length);
然后,在 take()
操作中,您只需查看特定的 class 对象是什么:
Object o = q.take();
if (o instanceof X) {
X x = (X) o;
// do work with x
} else if (o instanceof Y) {
Y y = (Y) o;
// do work with y
} else {
// o is neither X nor Y
}
如果 X
和 Y
继承自通用 class 或实现通用接口,请使您的队列更具体:
BlockingQueue<XYInterface> q = new ArrayBlockingQueue<>(length);
你可以按照 Sasha 的建议使用 BlockingQueue<Object>
,但我更喜欢将通用功能声明到接口中,然后让每个 class 处理它自己的功能,而不是使用 instanceof
声明:
public interface Common {
boolean shouldEnqueue();
void doSomething();
}
public class X implements Common {
public boolean shouldEnqueue() {
...
}
public void doSomething() {
System.out.println("This is X");
}
}
public class Y implements Common {
public boolean shouldEnqueue() {
...
}
public void doSomething() {
System.out.println("This is Y");
}
}
public class Producer {
private final BlockingQueue<Common> queue;
void maybeEnqueue(Common c) {
if(c.shouldEnqueue()) {
queue.add(c);
}
}
}
public class Consumer {
private final BlockingQueue<Common> queue;
void doSomething() {
queue.take().doSomething();
}
}
我有 class X
、class Y
和 class Z
。如果X
或Y
执行特定条件,则应将它们放入BlockingQueue
。 Class Z
直接从队列中取出。
我知道创建这样的东西:
BlockingQueue<X,Y> BQueue=new ArrayBlockingQueue<X,Y>(length);
是非法的。如何正确制作?
最简单的方法是让 BlockingQueue
接受任何对象类型:
BlockingQueue<Object> q = new ArrayBlockingQueue<>(length);
然后,在 take()
操作中,您只需查看特定的 class 对象是什么:
Object o = q.take();
if (o instanceof X) {
X x = (X) o;
// do work with x
} else if (o instanceof Y) {
Y y = (Y) o;
// do work with y
} else {
// o is neither X nor Y
}
如果 X
和 Y
继承自通用 class 或实现通用接口,请使您的队列更具体:
BlockingQueue<XYInterface> q = new ArrayBlockingQueue<>(length);
你可以按照 Sasha 的建议使用 BlockingQueue<Object>
,但我更喜欢将通用功能声明到接口中,然后让每个 class 处理它自己的功能,而不是使用 instanceof
声明:
public interface Common {
boolean shouldEnqueue();
void doSomething();
}
public class X implements Common {
public boolean shouldEnqueue() {
...
}
public void doSomething() {
System.out.println("This is X");
}
}
public class Y implements Common {
public boolean shouldEnqueue() {
...
}
public void doSomething() {
System.out.println("This is Y");
}
}
public class Producer {
private final BlockingQueue<Common> queue;
void maybeEnqueue(Common c) {
if(c.shouldEnqueue()) {
queue.add(c);
}
}
}
public class Consumer {
private final BlockingQueue<Common> queue;
void doSomething() {
queue.take().doSomething();
}
}