簡體   English   中英

在java中是否有任何(無界)公平阻塞隊列?

[英]Is there any (unbounded) fair blocking queue in java?

是否有任何阻塞隊列的實現,如果多個使用者從同一隊列中刪除元素,則保證公平的take()操作。 我檢查了LinkedBlockingQueue,LinkedTransferQueue,看起來兩者都不公平。 ArrayBlockingQueue提供了公平的操作,但它有限。

我們可以使用像ConcurrentLinked隊列和公平的信號量這樣的無界隊列來實現無限公平阻塞隊列。 下面的類沒有實現BlockingQueue接口中的所有方法,只是其中一些用於演示目的。 main()方法僅作為測試編寫。

public class FairBlockingQueue<T> {

    private final Queue<T> queue;
    private final Semaphore takeSemaphore;

    public FairBlockingQueue() {
        queue = new ConcurrentLinkedQueue<T>();
        takeSemaphore = new Semaphore(0, true);
    }

    public FairBlockingQueue(Collection<T> c) {
        queue = new ConcurrentLinkedQueue<T>(c);
        takeSemaphore = new Semaphore(c.size(), true);
    }

    public T poll() {
        if (!takeSemaphore.tryAcquire()) {
            return null;
        }
        return queue.poll();
    }

    public T poll(long millis) throws InterruptedException {
        if (!takeSemaphore.tryAcquire(millis, TimeUnit.MILLISECONDS)) {
            return null;
        }
        return queue.poll();
    }

    public T take() throws InterruptedException {
        takeSemaphore.acquire();
        return queue.poll();
    }

    public void add(T t) {
        queue.add(t);
        takeSemaphore.release();
    }

    public static void main(String[] args) throws Exception {
        FairBlockingQueue<Object> q = new FairBlockingQueue<Object>();
        Object o = q.poll();
        assert o == null;
        o = q.poll(1000);
        assert o == null;

        q.add(new Object());
        q.add(new Object());
        q.add(new Object());

        o = q.take();
        assert o != null;
        o = q.poll();
        assert o != null;
        o = q.poll(1000);
        assert o != null;

        o = q.poll();
        assert o == null;
    }
}

可以為SynchronousQueue指定公平政策:

將fairness設置為true構造的隊列以FIFO順序授予線程訪問權限

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM