SynchronousQueue特點及應用

SynchronousQueue

特點

SynchronousQueue是這樣一種阻塞隊列,其中每個 put 必須等待一個 take,反之亦然。同步隊列沒有任何內部容量,甚至連一個隊列的容量都沒有。 不能在同步隊列上進行 peek,因爲僅在試圖要取得元素時,該元素才存在;

它非常適合於傳遞性設計,在這種設計中,在一個線程中運行的對象要將某些信息、事件或任務傳遞給在另一個線程中運行的對象,它就必須與該對象同步。

  • 注意1:它一種阻塞隊列,其中每個 put 必須等待一個 take,反之亦然。
    同步隊列沒有任何內部容量,甚至連一個隊列的容量都沒有。

  • 注意2:它是線程安全的,是阻塞的。

  • 注意3:不允許使用 null 元素。

  • 注意4:公平排序策略是指調用put的線程之間,或take的線程之間。

  • 公平排序策略可以查考ArrayBlockingQueue中的公平策略。

  • 注意5:SynchronousQueue的以下方法很有趣:

    • iterator() 永遠返回空,因爲裏面沒東西。
    • peek() 永遠返回null。
    • put() 往queue放進去一個element以後就一直wait直到有其他thread進來把這個element取走。
    • offer() 往queue裏放一個element後立即返回,如果碰巧這個element被另一個thread取走了,offer方法返回true,認爲offer成功;否則返回false。
    • offer(2000, TimeUnit.SECONDS) 往queue裏放一個element但是等待指定的時間後才返回,返回的邏輯和offer()方法一樣。
    • take() 取出並且remove掉queue裏的element(認爲是在queue裏的。。。),取不到東西他會一直等。
    • poll() 取出並且remove掉queue裏的element(認爲是在queue裏的。。。),只有到碰巧另外一個線程正在往queue裏offer數據或者put數據的時候,該方法纔會取到東西。否則立即返回null。
    • poll(2000, TimeUnit.SECONDS) 等待指定的時間然後取出並且remove掉queue裏的element,其實就是再等其他的thread來往裏塞。
    • isEmpty()永遠是true。
    • remainingCapacity() 永遠是0。
    • remove()和removeAll() 永遠是false。

應用

JDK中Executors.newCachedThreadPool();中線程池使用的隊列就是SynchronousQueue,其offer方法返回的一般爲false,只有當元素恰好被其他線程取走時(可能有其他線程在阻塞take狀態)纔會返回true。所以每次一提交一個任務,就會啓動一個線程去運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章