2016-05-30 43 views
1

我想用彈簧ExecutorService使用CircularFifoQueue如何製作CircularFifoQueue線程安全?

以下不編譯,因爲CircularFifoQueue不是BlockingQueue類型。但它顯示我想要實現:

int threads = 10; 
int queueSize = 500; 
new java.util.concurrent.ThreadPoolExecutor(threads, threads, 0L, TimeUnit.MILLISECONDS, 
       new CircularFifoQueue(queueSize)); 

有了:

package org.apache.commons.collections4.queue; 

public class CircularFifoQueue<E> extends AbstractCollection<E> 
     implements Queue<E>, BoundedCollection<E>, Serializable 

問題:沒有上面的代碼提供線程安全(如CircularFifoQueue本身不是線程安全的)? 如果不是,我怎樣才能使它線程安全?

+0

CircularFifoQueue從何而來? –

+0

CircularFifoQueue阻塞隊列? –

+0

上面增加了軟件包信息。它不是* BlockingQueue(這可能是設計中的線程安全)。 – membersound

回答

1

你將不得不實際編寫自己的隊列實現。 由於CircularFifoQueue使用底層數組來保存元素,因此我將以java.util.concurrent包中的ArrayBlockingQueue數據結構爲出發點。

例子:

class ThreadSafeCircularFifoQueue<T> extends CircularFifoQueue<T> implements BlockingQueue<T> { 

    /** Main lock guarding all access */ 
    final ReentrantLock lock; 

    /** Condition for waiting takes */ 
    private final Condition notEmpty; 

    /** Condition for waiting puts */ 
    private final Condition notFull; 

    @Override 
    public int size() { 

     final ReentrantLock lock = this.lock; 
     lock.lock(); 
     try { 
      return super.size(); 
     } finally { 
      lock.unlock(); 
     } 
    } 

    //and so forth 
} 
2

工作隊列意味着會阻止,因此你需要添加一個decorator,使該CircularFifoQueue一個BLockingQueue

class BlockingCircularFifoQueue<E> implements BlockingQueue<E>{ 
    private CircularFifoQueue<E> backingCollection; 
    ... 
} 

並在需要時委託給後備集合。 您當然需要獲得ConditionsLock

+0

是否延長了CircularFifoQueue的糟糕設計? – Dexter

+0

@Dexter是的,它是,http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –

+0

我認爲「是一種關係」在這裏成立。無論如何,謝謝你的鏈接:) – Dexter