Java ArrayBlockingQueue:访问特定元素

Java ArrayBlockingQueue:访问特定元素,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我有一个ArrayBlockingQueue声明如下: private BlockingQueue<E> queue = new ArrayBlockingQueue<E>(); 我必须取队列的j元素。我该怎么做??thx你可以写: E element = (E) queue.toArray()[j]; 这可能会发出警告,但可以安全地忽略它。试试这个 public E takeElement(int j) { for(int i = 0; i < j;

我有一个ArrayBlockingQueue声明如下:

private BlockingQueue<E> queue = new ArrayBlockingQueue<E>();
我必须取队列的j元素。我该怎么做??thx

你可以写:

E element = (E) queue.toArray()[j];
这可能会发出警告,但可以安全地忽略它。

试试这个

public E takeElement(int j) {
    for(int i = 0; i < j; i++) {
        E e = queue.poll();
        if (i == j - 1) {
            return e;
        }
    }
    return null;
}
public元素(int j){
对于(int i=0;i
或基于迭代器的版本:

public E takeElement(int j) {
    Iterator<E> it = queue.iterator();
    for(int i = 0; it.hasNext() && i < j; i++) {
        E e = it.next();
        if (i == j - 1) {
            return e;
        }
    }
    return null; 
}
public元素(int j){
迭代器it=queue.Iterator();
for(int i=0;it.hasNext()&&i
如果您需要索引访问,为什么要使用BlockingQueue?它的预期用途是按顺序处理项目,如果队列为空,则可能会等待(阻塞)。。。有时我必须用头元素,有时我必须用j元素。你真正想解决的问题是什么?您不需要以从未打算使用过的方式使用BlockingQueue:您需要解决某些问题的不同数据结构/算法。有什么问题吗?谢谢。现在我有一个相反的问题。。。如果我必须把一个元素放到j位置,我该怎么办?你不能。如果您需要这样的访问权限,则不应使用
队列
。请考虑<代码> ARAYLIST/<代码>。我这样做,但我不确定这是线程DAFE操作:Queal.toRayay.()[j] =元素;将一个元素分配到数组对
队列
没有影响。这将删除所搜索元素前面的所有元素。我认为这不是OP想要的。当然,它更符合
队列
的目的。Poll删除所有head元素,我不想要这个。你真的应该使用
列表
。只需键入
list.get(0)当你需要head元素时。当57.2k用户发布的答案被自动标记为低质量时,这有点滑稽。以后再多解释一下你的答案,它就不必出现在LQ队列中了。
public E takeElement(int j) {
    Iterator<E> it = queue.iterator();
    for(int i = 0; it.hasNext() && i < j; i++) {
        E e = it.next();
        if (i == j - 1) {
            return e;
        }
    }
    return null; 
}