ArrayBlockingQueue add方法是否即时?

时间:2018-01-11 05:58:28

标签: java multithreading queue

对于Java中的ArrayBlockingQueue,queue.add(element)是否锁定了它所在的线程?我有一个运行了几十个线程的应用程序,它们都将信息放入一个ArrayBlockingQueue中。线程无法在短时间内锁定。如果它们都将对象放入队列中,那么add方法是否会立即继续运行并让队列将来将对象放入自身中,还是等到它实际被放入队列中?

3 个答案:

答案 0 :(得分:1)

ArrayBlockingQueue是Qu​​eue的实现,它还支持在检索元素时等待队列变为非空的操作,并在存储元素时等待队列中的空间可用。

如果可以在不超出队列容量的情况下立即执行此操作,则

add方法会在此队列的尾部插入指定的元素,成功时返回true,如果此队列已满,则抛出IllegalStateException。

尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取一个元素同样会阻塞。

创建后,无法更改容量。

答案 1 :(得分:1)

是的,当您在ArrayBlockingQueue中调用add方法时,它将锁定以执行操作,或者它将如何使线程安全。你如何将你的对象放在多线程环境中的任何共享变量。你需要同步。你可以检查一些非阻塞集合(可以创建自己的链表)。你将添加你的值,然后一个守护程序线程将读取一个一个并排队。

JAVA实施

添加方法内部调用offer。如果您不想等待超过给定时间,可以使用public boolean tryLock(long timeout, TimeUnit unit)

public boolean offer(E e) {
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            if (count == items.length)
                return false;
            else {
                enqueue(e);
                return true;
            }
        } finally {
            lock.unlock();
        }
    }

答案 2 :(得分:0)

在使用java.util.concurrent.locks.ReentrantLock保护的ArrayBlockingQueue并发操作中。并且操作是同步的。将项添加到队列时,在排队操作完成后,添加操作将返回。