EDU.oswego.cs.dl.util.concurrent
abstract public class: SemaphoreControlledChannel [javadoc |
source]
java.lang.Object
EDU.oswego.cs.dl.util.concurrent.SemaphoreControlledChannel
All Implemented Interfaces:
BoundedChannel
Direct Known Subclasses:
PipedChannel, BoundedPriorityQueue, Slot
Abstract class for channels that use Semaphores to
control puts and takes.
[ Introduction to this package. ]
Field Summary |
---|
protected final Semaphore | putGuard_ | |
protected final Semaphore | takeGuard_ | |
protected int | capacity_ | |
Constructor: |
public SemaphoreControlledChannel(int capacity) throws IllegalArgumentException {
if (capacity < = 0) throw new IllegalArgumentException();
capacity_ = capacity;
putGuard_ = new Semaphore(capacity);
takeGuard_ = new Semaphore(0);
}
Create a channel with the given capacity and default
semaphore implementation Throws:
IllegalArgumentException - if capacity less or equal to zero
*
- exception:
IllegalArgumentException - if capacity less or equal to zero
*
|
public SemaphoreControlledChannel(int capacity,
Class semaphoreClass) throws IllegalArgumentException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException {
if (capacity < = 0) throw new IllegalArgumentException();
capacity_ = capacity;
Class[] longarg = { Long.TYPE };
Constructor ctor = semaphoreClass.getDeclaredConstructor(longarg);
Long[] cap = { new Long(capacity) };
putGuard_ = (Semaphore)(ctor.newInstance(cap));
Long[] zero = { new Long(0) };
takeGuard_ = (Semaphore)(ctor.newInstance(zero));
}
Create a channel with the given capacity and
semaphore implementations instantiated from the supplied class Throws:
IllegalArgumentException - if capacity less or equal to zero.
NoSuchMethodException - If class does not have constructor
that intializes permits
SecurityException - if constructor information
not accessible
InstantiationException - if semaphore class is abstract
IllegalAccessException - if constructor cannot be called
InvocationTargetException - if semaphore constructor throws an
exception
- exception:
IllegalArgumentException - if capacity less or equal to zero.
- exception:
NoSuchMethodException - If class does not have constructor
that intializes permits
- exception:
SecurityException - if constructor information
not accessible
- exception:
InstantiationException - if semaphore class is abstract
- exception:
IllegalAccessException - if constructor cannot be called
- exception:
InvocationTargetException - if semaphore constructor throws an
exception
|
Methods from java.lang.Object: |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Method from EDU.oswego.cs.dl.util.concurrent.SemaphoreControlledChannel Detail: |
public int capacity() {
return capacity_;
}
|
abstract protected Object extract()
Internal mechanics of take. |
abstract protected void insert(Object x)
Internal mechanics of put. |
public boolean offer(Object x,
long msecs) throws InterruptedException {
if (x == null) throw new IllegalArgumentException();
if (Thread.interrupted()) throw new InterruptedException();
if (!putGuard_.attempt(msecs))
return false;
else {
try {
insert(x);
takeGuard_.release();
return true;
}
catch (ClassCastException ex) {
putGuard_.release();
throw ex;
}
}
}
|
public Object poll(long msecs) throws InterruptedException {
if (Thread.interrupted()) throw new InterruptedException();
if (!takeGuard_.attempt(msecs))
return null;
else {
try {
Object x = extract();
putGuard_.release();
return x;
}
catch (ClassCastException ex) {
takeGuard_.release();
throw ex;
}
}
}
|
public void put(Object x) throws InterruptedException {
if (x == null) throw new IllegalArgumentException();
if (Thread.interrupted()) throw new InterruptedException();
putGuard_.acquire();
try {
insert(x);
takeGuard_.release();
}
catch (ClassCastException ex) {
putGuard_.release();
throw ex;
}
}
|
public int size() {
return (int)(takeGuard_.permits());
}
Return the number of elements in the buffer.
This is only a snapshot value, that may change
immediately after returning.
* |
public Object take() throws InterruptedException {
if (Thread.interrupted()) throw new InterruptedException();
takeGuard_.acquire();
try {
Object x = extract();
putGuard_.release();
return x;
}
catch (ClassCastException ex) {
takeGuard_.release();
throw ex;
}
}
|