public class ThreadGate extends Base implements Gate
Each call to enter requires a corresponding call to exit, similar to the JVM implementation of the "synchronized" keyword that places a monitorenter op that the beginning of the synchronized portion and protects the synchronized portion with a try..finally construct that ensures the execution of a monitorexit op. For example, the following would ensure proper clean-up using a ThreadGate:
gate.enter(); try { ... } finally { gate.exit(); }Similarly, each call to close() should be matched with a call to open(), unless the gate is being destroyed:
gate.close(); try { ... } finally { gate.open(); }or:
gate.close(); gate.destroy();The enter/exit calls can be nested; the same thread can invoke enter multiple times as long as exit is invoked a corresponding number of times. The close/open calls work in the same manner. Lastly, the thread that closes the gate may continue to enter/exit the gate even when it is closed since that thread has exclusive control of the gate.
Modifier and Type | Class and Description |
---|---|
static class |
ThreadGate.ThreadLocalCounter
Specialization of ThreadLocalObject that can be used for efficient thread local long counters.
|
Base.LoggingWriter, Base.StackFrame
Modifier and Type | Field and Description |
---|---|
static int |
GATE_CLOSED
GATE_CLOSED: A single thread is inside the gates; other threads cannot enter.
|
static int |
GATE_CLOSING
GATE_CLOSING: A thread is waiting to be the only thread inside the gates; other threads can only exit.
|
static int |
GATE_DESTROYED
GATE_DESTROYED: Life-cycle is complete; the object is no longer usable.
|
static int |
GATE_OPEN
GATE_OPEN: Threads may enter and exit the gates.
|
Constructor and Description |
---|
ThreadGate()
Default constructor.
|
Modifier and Type | Method and Description |
---|---|
boolean |
barEntry(long cMillis)
Bar entry to the thread gate by other threads, but do not wait for the gate to close.
|
boolean |
close(long cMillis)
Close the gate.
|
void |
destroy()
Destroy the thread gate.
|
protected long |
doWait(long cMillis)
Wait up to the specified number of milliseconds for notification.
|
boolean |
enter(long cMillis)
Enter the gate.
|
void |
exit()
Exit the gate.
|
int |
getActiveCount()
Return the number of unmatched completed enter calls.
|
int |
getCloseCount()
Return the number of unmatched completed close/barEntry calls.
|
protected Thread |
getClosingThread()
Return the thread that is closing the gates.
|
int |
getStatus()
Return the current thread gate status.
|
protected long |
getVersion()
Return the total number of times the gate has been fully opened.
|
boolean |
isClosed()
Determine if any thread has closed the gate and continues to hold exclusive access.
|
boolean |
isClosedByCurrentThread()
Determine if the calling thread has closed the gate and continues to hold exclusive access.
|
boolean |
isEnteredByCurrentThread()
Determines if the current thread has entered the gate and not yet exited.
|
void |
open()
Re-open the closed gate.
|
protected void |
setCloseCount(int cClose)
Specify the number of unmatched completed close/barEntry calls.
|
protected void |
setClosingThread(Thread thread)
Specify the thread that is closing the gates.
|
protected void |
setVersion(long cVersion)
Specify the total number of times the gate has been fully opened.
|
String |
toString()
Provide a human-readable representation of this ThreadGate.
|
protected int |
updateStatus(int nStatus)
Update the current thread gate status, without changing the active count.
|
azzert, azzert, azzert, azzertFailed, breakLines, breakLines, capitalize, checkNotEmpty, checkNotNull, checkRange, computeSafeWaitTime, decimalValue, dup, dup, ensureBigDecimal, ensureClassLoader, ensureRuntimeException, ensureRuntimeException, equals, equalsDeep, err, err, err, err, err, escape, formatDateTime, getCallerStackFrame, getCommonMonitor, getCommonMonitor, getCommonMonitor, getContextClassLoader, getContextClassLoader, getDeepMessage, getErr, getLastSafeTimeMillis, getLog, getMaxDecDigits, getMaxHexDigits, getOriginalException, getOut, getRandom, getRandomBinary, getRandomBinary, getRandomString, getSafeTimeMillis, getStackFrame, getStackFrames, getStackTrace, getStackTrace, getThreadFactory, getTimeZone, getUpTimeMillis, hashCode, hexValue, indentString, indentString, isDecimal, isHex, isLogEcho, isOctal, log, log, log, log, log, makeInteger, makeLong, makeThread, mod, mod, octalValue, out, out, out, out, out, pad, parseBandwidth, parseBandwidth, parseDelimitedString, parseHex, parseHex, parseMemorySize, parseMemorySize, parsePercentage, parseTime, parseTime, parseTimeNanos, parseTimeNanos, printStackTrace, randomize, randomize, randomize, read, read, read, read, read, read, read, replace, setErr, setLog, setLogEcho, setOut, sleep, toBandwidthString, toBandwidthString, toCharEscape, toCrc, toCrc, toCrc, toCrc, toCrc, toDecString, toDelimitedString, toDelimitedString, toDelimitedString, toDelimitedString, toHex, toHex, toHexDump, toHexEscape, toHexEscape, toHexEscape, toHexEscape, toHexString, toMemorySizeString, toMemorySizeString, toQuotedCharEscape, toQuotedStringEscape, toSqlString, toString, toString, toStringEscape, toUnicodeEscape, trace, trace, trace, trace, trace, trace, trace, trace, trace, truncateString, truncateString, wait
public static final int GATE_OPEN
public static final int GATE_CLOSING
public static final int GATE_CLOSED
public static final int GATE_DESTROYED
public boolean barEntry(long cMillis)
Each successful invocation of this method must ultimately have a corresponding invocation of the open method (assuming the thread gate is not destroyed) even if the calling thread does not subsequently close the gate.
gate.barEntry(-1);
try
{
// processing that does not require the gate to be closed
// ...
}
finally
{
gate.close(-1);
try
{
// processing that does require the gate to be closed
// ...
}
finally
{
gate.open(); // matches gate.close()
}
gate.open(); // matches gate.barEntry()
}
public boolean close(long cMillis)
Gate.open()
method.public void destroy()
public boolean enter(long cMillis)
Gate.exit()
method.public void exit()
Gate.enter(long)
method.public void open()
public boolean isClosedByCurrentThread()
isClosedByCurrentThread
in interface Gate
public boolean isEnteredByCurrentThread()
isEnteredByCurrentThread
in interface Gate
public boolean isClosed()
protected long doWait(long cMillis)
public int getActiveCount()
protected long getVersion()
protected void setVersion(long cVersion)
The caller must have the gate closed.
public int getCloseCount()
protected void setCloseCount(int cClose)
The caller must have the gate closed/closing.
protected Thread getClosingThread()
protected void setClosingThread(Thread thread)
The caller must be synchronized on the ThreadGate.
public int getStatus()
protected int updateStatus(int nStatus)
The caller must hold synchronization on the ThreadGate.
nStatus
- the new status