public class Timeout extends Object implements AutoCloseable
try (Timeout t = Timeout.after(5, TimeUnit.SECONDS)) { doSomething(); } // this thread will self-interrupt if it doesn't reach this line within 5 seconds catch (InterruptedException e) { // thread timed out or was otherwise interrupted }In order for this to work any blocking code executed from within the context of the Timeout must use the
Blocking
static helper methods for blocking. An example of a compatible blocking call would be:
void doSomething() { Object oField = m_oField; synchronized (oField) { Blocking.wait(oField); // rather then oField.wait(); } }Note that Timeout can only self-interrupt at interruptible points, and does not defend against CPU bound loops for example.
Modifier and Type | Field and Description |
---|---|
protected long |
f_cMillisTimeout
This Timeout's timeout.
|
protected boolean |
f_fTloCreator
True iff this Timeout created (and thus must ultimately destroy) the TLO.
|
protected long |
f_lTimeoutOrig
The original timeout before this instance changed it.
|
protected MutableLong |
f_mlTimeout
Cached reference to the thread's MutableLong holding it's current timeout.
|
protected static ThreadLocal<MutableLong> |
s_tloTimeout
A thread-local containing the calling thread's timeout value.
|
Modifier | Constructor and Description |
---|---|
protected |
Timeout(long cMillis,
boolean fForceOverride)
Specify a new timeout.
|
Modifier and Type | Method and Description |
---|---|
static Timeout |
after(long cMillis)
Specify a new timeout.
|
static Timeout |
after(long time,
TimeUnit unit)
Specify a new timeout.
|
void |
close()
As part of closing the Timeout resource any former timeout will be restored.
|
static boolean |
isSet()
Return true if calling thread specified a timeout.
|
static boolean |
isTimedOut()
Return true if the calling thread is timed out.
|
static Timeout |
override(long cMillis)
Specify a new timeout, potentially extending an already active timeout.
|
static long |
remainingTimeoutMillis()
Return the number of milliseconds before this thread will timeout.
|
protected final boolean f_fTloCreator
protected final MutableLong f_mlTimeout
protected final long f_cMillisTimeout
protected final long f_lTimeoutOrig
protected static final ThreadLocal<MutableLong> s_tloTimeout
protected Timeout(long cMillis, boolean fForceOverride)
cMillis
- the new timeout.fForceOverride
- true if this timeout is allowed to extend a parent timeout.public void close() throws InterruptedException
close
in interface AutoCloseable
InterruptedException
- if the calling thread is interruptedpublic static Timeout after(long time, TimeUnit unit)
time
- the new timeoutunit
- the unit the timeout is expressed inpublic static Timeout after(long cMillis)
cMillis
- the new timeoutpublic static Timeout override(long cMillis)
This variant allows the caller to extend a parent timeout. This is rarely needed, and is roughly the equivalent of silently consuming a thread interrupt without rethrowing the InterruptedException. Use of this method should be extremely limited.
cMillis
- the new timeoutpublic static long remainingTimeoutMillis()
public static boolean isTimedOut()
public static boolean isSet()