2016-05-30 274 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