The KeyboardFocusManager is responsible for managing the active and focused
Windows, and the current focus owner. The focus owner is defined as the
Component in an application that will typically receive all KeyEvents
generated by the user. The focused Window is the Window that is, or
contains, the focus owner. Only a Frame or a Dialog can be the active
Window. The native windowing system may denote the active Window or its
children with special decorations, such as a highlighted title bar. The
active Window is always either the focused Window, or the first Frame or
Dialog that is an owner of the focused Window.
The KeyboardFocusManager is both a centralized location for client code to
query for the focus owner and initiate focus changes, and an event
dispatcher for all FocusEvents, WindowEvents related to focus, and
KeyEvents.
Some browsers partition applets in different code bases into separate
contexts, and establish walls between these contexts. In such a scenario,
there will be one KeyboardFocusManager per context. Other browsers place all
applets into the same context, implying that there will be only a single,
global KeyboardFocusManager for all applets. This behavior is
implementation-dependent. Consult your browser's documentation for more
information. No matter how many contexts there may be, however, there can
never be more than one focus owner, focused Window, or active Window, per
ClassLoader.
Please see
How to Use the Focus Subsystem,
a section in The Java Tutorial, and the
Focus Specification
for more information.
Initializes a KeyboardFocusManager.
The identifier for the Backward focus traversal keys.
The identifier for the Down Cycle focus traversal keys.
The identifier for the Forward focus traversal keys.
The identifier for the Up Cycle focus traversal keys.
Adds a KeyEventDispatcher to this KeyboardFocusManager's dispatcher
chain. This KeyboardFocusManager will request that each
KeyEventDispatcher dispatch KeyEvents generated by the user before
finally dispatching the KeyEvent itself. KeyEventDispatchers will be
notified in the order in which they were added. Notifications will halt
as soon as one KeyEventDispatcher returns
true
from its
dispatchKeyEvent
method. There is no limit to the total
number of KeyEventDispatchers which can be added, nor to the number of
times which a particular KeyEventDispatcher instance can be added.
If a null dispatcher is specified, no action is taken and no exception
is thrown.
Adds a KeyEventPostProcessor to this KeyboardFocusManager's post-
processor chain. After a KeyEvent has been dispatched to and handled by
its target, KeyboardFocusManager will request that each
KeyEventPostProcessor perform any necessary post-processing as part
of the KeyEvent's final resolution. KeyEventPostProcessors
will be notified in the order in which they were added; the current
KeyboardFocusManager will be notified last. Notifications will halt
as soon as one KeyEventPostProcessor returns
true
from its
postProcessKeyEvent
method. There is no limit to the the
total number of KeyEventPostProcessors that can be added, nor to the
number of times that a particular KeyEventPostProcessor instance can be
added.
If a null post-processor is specified, no action is taken and no
exception is thrown.
Adds a PropertyChangeListener to the listener list. The listener is
registered for all bound properties of this class, including the
following:
- whether the KeyboardFocusManager is currently managing focus
for this application or applet's browser context
("managingFocus")
- the focus owner ("focusOwner")
- the permanent focus owner ("permanentFocusOwner")
- the focused Window ("focusedWindow")
- the active Window ("activeWindow")
- the default focus traversal policy
("defaultFocusTraversalPolicy")
- the Set of default FORWARD_TRAVERSAL_KEYS
("forwardDefaultFocusTraversalKeys")
- the Set of default BACKWARD_TRAVERSAL_KEYS
("backwardDefaultFocusTraversalKeys")
- the Set of default UP_CYCLE_TRAVERSAL_KEYS
("upCycleDefaultFocusTraversalKeys")
- the Set of default DOWN_CYCLE_TRAVERSAL_KEYS
("downCycleDefaultFocusTraversalKeys")
- the current focus cycle root ("currentFocusCycleRoot")
If listener is null, no exception is thrown and no action is performed.
Adds a PropertyChangeListener to the listener list for a specific
property. The specified property may be user-defined, or one of the
following:
- whether the KeyboardFocusManager is currently managing focus
for this application or applet's browser context
("managingFocus")
- the focus owner ("focusOwner")
- the permanent focus owner ("permanentFocusOwner")
- the focused Window ("focusedWindow")
- the active Window ("activeWindow")
- the default focus traversal policy
("defaultFocusTraversalPolicy")
- the Set of default FORWARD_TRAVERSAL_KEYS
("forwardDefaultFocusTraversalKeys")
- the Set of default BACKWARD_TRAVERSAL_KEYS
("backwardDefaultFocusTraversalKeys")
- the Set of default UP_CYCLE_TRAVERSAL_KEYS
("upCycleDefaultFocusTraversalKeys")
- the Set of default DOWN_CYCLE_TRAVERSAL_KEYS
("downCycleDefaultFocusTraversalKeys")
- the current focus cycle root ("currentFocusCycleRoot")
If listener is null, no exception is thrown and no action is performed.
Adds a VetoableChangeListener to the listener list for a specific
property. The specified property may be user-defined, or one of the
following:
- the focus owner ("focusOwner")
- the permanent focus owner ("permanentFocusOwner")
- the focused Window ("focusedWindow")
- the active Window ("activeWindow")
If listener is null, no exception is thrown and no action is performed.
Adds a VetoableChangeListener to the listener list. The listener is
registered for all vetoable properties of this class, including the
following:
- the focus owner ("focusOwner")
- the permanent focus owner ("permanentFocusOwner")
- the focused Window ("focusedWindow")
- the active Window ("activeWindow")
If listener is null, no exception is thrown and no action is performed.
Clears the global focus owner at both the Java and native levels. If
there exists a focus owner, that Component will receive a permanent
FOCUS_LOST event. After this operation completes, the native windowing
system will discard all user-generated KeyEvents until the user selects
a new Component to receive focus, or a Component is given focus
explicitly via a call to requestFocus()
. This operation
does not change the focused or active Windows.
This method is called by the AWT event dispatcher requesting that the
current KeyboardFocusManager dispatch the specified event on its behalf.
It is expected that all KeyboardFocusManagers will dispatch all
FocusEvents, all WindowEvents related to focus, and all KeyEvents.
These events should be dispatched based on the KeyboardFocusManager's
notion of the focus owner and the focused and active Windows, sometimes
overriding the source of the specified AWTEvent. Dispatching must be
done using redispatchEvent
to prevent the AWT event
dispatcher from recursively requesting that the KeyboardFocusManager
dispatch the event again. If this method returns false
,
then the AWT event dispatcher will attempt to dispatch the event itself.
This method is called by the current KeyboardFocusManager requesting
that this KeyEventDispatcher dispatch the specified event on its behalf.
This KeyEventDispatcher is free to retarget the event, consume it,
dispatch it itself, or make other changes. This capability is typically
used to deliver KeyEvents to Components other than the focus owner. This
can be useful when navigating children of non-focusable Windows in an
accessible environment, for example. Note that if a KeyEventDispatcher
dispatches the KeyEvent itself, it must use
redispatchEvent
to prevent the current KeyboardFocusManager from recursively requesting
that this KeyEventDispatcher dispatch the event again.
If an implementation of this method returns false
, then
the KeyEvent is passed to the next KeyEventDispatcher in the chain,
ending with the current KeyboardFocusManager. If an implementation
returns true
, the KeyEvent is assumed to have been
dispatched (although this need not be the case), and the current
KeyboardFocusManager will take no further action with regard to the
KeyEvent. In such a case,
KeyboardFocusManager.dispatchEvent
should return
true
as well. If an implementation consumes the KeyEvent,
but returns false
, the consumed event will still be passed
to the next KeyEventDispatcher in the chain. It is important for
developers to check whether the KeyEvent has been consumed before
dispatching it to a target. By default, the current KeyboardFocusManager
will not dispatch a consumed KeyEvent.
Moves the focus down one focus traversal cycle from the current focus
owner, if and only if the current focus owner is a Container that is a
focus cycle root. Typically, the focus owner is set to the current focus
owner's default Component to focus, and the current focus cycle root is
set to the current focus owner. If the current focus owner is not a
Container that is a focus cycle root, then no focus traversal operation
occurs.
Moves the focus down one focus traversal cycle. Typically, if
aContainer is a focus cycle root, then the focus owner is set to
aContainer's default Component to focus, and the current focus cycle
root is set to aContainer. If aContainer is not a focus cycle root, then
no focus traversal operation occurs.
Indicates whether some other object is "equal to" this one.
The equals
method implements an equivalence relation
on non-null object references:
- It is reflexive: for any non-null reference value
x
, x.equals(x)
should return
true
.
- It is symmetric: for any non-null reference values
x
and y
, x.equals(y)
should return true
if and only if
y.equals(x)
returns true
.
- It is transitive: for any non-null reference values
x
, y
, and z
, if
x.equals(y)
returns true
and
y.equals(z)
returns true
, then
x.equals(z)
should return true
.
- It is consistent: for any non-null reference values
x
and y
, multiple invocations of
x.equals(y) consistently return true
or consistently return false
, provided no
information used in equals
comparisons on the
objects is modified.
- For any non-null reference value
x
,
x.equals(null)
should return false
.
The equals method for class Object
implements
the most discriminating possible equivalence relation on objects;
that is, for any non-null reference values x
and
y
, this method returns true
if and only
if x
and y
refer to the same object
(x == y
has the value true
).
Note that it is generally necessary to override the hashCode
method whenever this method is overridden, so as to maintain the
general contract for the hashCode method, which states
that equal objects must have equal hash codes.
Focuses the Component after the current focus owner.
Focuses the Component after aComponent, typically based on a
FocusTraversalPolicy.
Focuses the Component before the current focus owner.
Focuses the Component before aComponent, typically based on a
FocusTraversalPolicy.
Returns the active Window, if the active Window is in the same context
as the calling thread. Only a Frame or a Dialog can be the active
Window. The native windowing system may denote the active Window or its
children with special decorations, such as a highlighted title bar.
The active Window is always either the focused Window, or the first
Frame or Dialog that is an owner of the focused Window.
Returns the runtime class of an object. That Class
object is the object that is locked by static synchronized
methods of the represented class.
Returns the current focus cycle root, if the current focus cycle root is
in the same context as the calling thread. If the focus owner is itself
a focus cycle root, then it may be ambiguous as to which Components
represent the next and previous Components to focus during normal focus
traversal. In that case, the current focus cycle root is used to
differentiate among the possibilities.
This method is intended to be used only by KeyboardFocusManagers and
focus implementations. It is not for general client use.
Returns the current KeyboardFocusManager instance for the calling
thread's context.
Returns a Set of default focus traversal keys for a given traversal
operation. This traversal key Set will be in effect on all Windows that
have no such Set of their own explicitly defined. This Set will also be
inherited, recursively, by any child Component of those Windows that has
no such Set of its own explicitly defined. (See
setDefaultFocusTraversalKeys
for a full description of each
operation.)
Returns the default FocusTraversalPolicy. Top-level components
use this value on their creation to initialize their own focus traversal
policy by explicit call to Container.setFocusTraversalPolicy.
Returns the focused Window, if the focused Window is in the same context
as the calling thread. The focused Window is the Window that is or
contains the focus owner.
Returns the focus owner, if the focus owner is in the same context as
the calling thread. The focus owner is defined as the Component in an
application that will typically receive all KeyEvents generated by the
user. KeyEvents which map to the focus owner's focus traversal keys will
not be delivered if focus traversal keys are enabled for the focus
owner. In addition, KeyEventDispatchers may retarget or consume
KeyEvents before they reach the focus owner.
Returns the permanent focus owner, if the permanent focus owner is in
the same context as the calling thread. The permanent focus owner is
defined as the last Component in an application to receive a permanent
FOCUS_GAINED event. The focus owner and permanent focus owner are
equivalent unless a temporary focus change is currently in effect. In
such a situation, the permanent focus owner will again be the focus
owner when the temporary focus change ends.
Returns an array of all the property change listeners
registered on this keyboard focus manager.
Returns an array of all the PropertyChangeListener
s
associated with the named property.
Returns an array of all the vetoable change listeners
registered on this keyboard focus manager.
Returns an array of all the VetoableChangeListener
s
associated with the named property.
Returns a hash code value for the object. This method is
supported for the benefit of hashtables such as those provided by
java.util.Hashtable
.
The general contract of hashCode
is:
- Whenever it is invoked on the same object more than once during
an execution of a Java application, the hashCode method
must consistently return the same integer, provided no information
used in equals comparisons on the object is modified.
This integer need not remain consistent from one execution of an
application to another execution of the same application.
- If two objects are equal according to the equals(Object)
method, then calling the
hashCode
method on each of
the two objects must produce the same integer result.
- It is not required that if two objects are unequal
according to the
method, then calling the hashCode method on each of the
two objects must produce distinct integer results. However, the
programmer should be aware that producing distinct integer results
for unequal objects may improve the performance of hashtables.
As much as is reasonably practical, the hashCode method defined by
class Object does return distinct integers for distinct
objects. (This is typically implemented by converting the internal
address of the object into an integer, but this implementation
technique is not required by the
JavaTM programming language.)
Wakes up a single thread that is waiting on this object's
monitor. If any threads are waiting on this object, one of them
is chosen to be awakened. The choice is arbitrary and occurs at
the discretion of the implementation. A thread waits on an object's
monitor by calling one of the
wait
methods.
The awakened thread will not be able to proceed until the current
thread relinquishes the lock on this object. The awakened thread will
compete in the usual manner with any other threads that might be
actively competing to synchronize on this object; for example, the
awakened thread enjoys no reliable privilege or disadvantage in being
the next thread to lock this object.
This method should only be called by a thread that is the owner
of this object's monitor. A thread becomes the owner of the
object's monitor in one of three ways:
- By executing a synchronized instance method of that object.
- By executing the body of a
synchronized
statement
that synchronizes on the object.
- For objects of type
Class,
by executing a
synchronized static method of that class.
Only one thread at a time can own an object's monitor.
Wakes up all threads that are waiting on this object's monitor. A
thread waits on an object's monitor by calling one of the
wait
methods.
The awakened threads will not be able to proceed until the current
thread relinquishes the lock on this object. The awakened threads
will compete in the usual manner with any other threads that might
be actively competing to synchronize on this object; for example,
the awakened threads enjoy no reliable privilege or disadvantage in
being the next thread to lock this object.
This method should only be called by a thread that is the owner
of this object's monitor. See the notify
method for a
description of the ways in which a thread can become the owner of
a monitor.
This method is called by the current KeyboardFocusManager, requesting
that this KeyEventPostProcessor perform any necessary post-processing
which should be part of the KeyEvent's final resolution. At the time
this method is invoked, typically the KeyEvent has already been
dispatched to and handled by its target. However, if no Component in
the application currently owns the focus, then the KeyEvent has not
been dispatched to any Component. Typically, KeyEvent post-processing
will be used to implement features which require global KeyEvent
post-handling, such as menu shortcuts. Note that if a
KeyEventPostProcessor wishes to dispatch the KeyEvent, it must use
redispatchEvent
to prevent the AWT from recursively
requesting that this KeyEventPostProcessor perform post-processing
of the event again.
If an implementation of this method returns false
, then the
KeyEvent is passed to the next KeyEventPostProcessor in the chain,
ending with the current KeyboardFocusManager. If an implementation
returns true
, the KeyEvent is assumed to have been fully
handled (although this need not be the case), and the AWT will take no
further action with regard to the KeyEvent. If an implementation
consumes the KeyEvent but returns false
, the consumed
event will still be passed to the next KeyEventPostProcessor in the
chain. It is important for developers to check whether the KeyEvent has
been consumed before performing any post-processing of the KeyEvent. By
default, the current KeyboardFocusManager will perform no post-
processing in response to a consumed KeyEvent.
This method initiates a focus traversal operation if and only if the
KeyEvent represents a focus traversal key for the specified
focusedComponent. It is expected that focusedComponent is the current
focus owner, although this need not be the case. If it is not,
focus traversal will nevertheless proceed as if focusedComponent
were the current focus owner.
Redispatches an AWTEvent in such a way that the AWT event dispatcher
will not recursively request that the KeyboardFocusManager, or any
installed KeyEventDispatchers, dispatch the event again. Client
implementations of
dispatchEvent
and client-defined
KeyEventDispatchers must call
redispatchEvent(target, e)
instead of
target.dispatchEvent(e)
to dispatch an event.
This method is intended to be used only by KeyboardFocusManagers and
KeyEventDispatchers. It is not for general client use.
Removes a KeyEventDispatcher which was previously added to this
KeyboardFocusManager's dispatcher chain. This KeyboardFocusManager
cannot itself be removed, unless it was explicitly re-registered via a
call to
addKeyEventDispatcher
.
If a null dispatcher is specified, if the specified dispatcher is not
in the dispatcher chain, or if this KeyboardFocusManager is specified
without having been explicitly re-registered, no action is taken and no
exception is thrown.
Removes a previously added KeyEventPostProcessor from this
KeyboardFocusManager's post-processor chain. This KeyboardFocusManager
cannot itself be entirely removed from the chain. Only additional
references added via
addKeyEventPostProcessor
can be
removed.
If a null post-processor is specified, if the specified post-processor
is not in the post-processor chain, or if this KeyboardFocusManager is
specified without having been explicitly added, no action is taken and
no exception is thrown.
Removes a PropertyChangeListener from the listener list. This method
should be used to remove the PropertyChangeListeners that were
registered for all bound properties of this class.
If listener is null, no exception is thrown and no action is performed.
Removes a PropertyChangeListener from the listener list for a specific
property. This method should be used to remove PropertyChangeListeners
that were registered for a specific bound property.
If listener is null, no exception is thrown and no action is performed.
Removes a VetoableChangeListener from the listener list for a specific
property. This method should be used to remove VetoableChangeListeners
that were registered for a specific bound property.
If listener is null, no exception is thrown and no action is performed.
Removes a VetoableChangeListener from the listener list. This method
should be used to remove the VetoableChangeListeners that were
registered for all vetoable properties of this class.
If listener is null, no exception is thrown and no action is performed.
Sets the current KeyboardFocusManager instance for the calling thread's
context. If null is specified, then the current KeyboardFocusManager
is replaced with a new instance of DefaultKeyboardFocusManager.
If a SecurityManager is installed, the calling thread must be granted
the AWTPermission "replaceKeyboardFocusManager" in order to replace the
the current KeyboardFocusManager. If this permission is not granted,
this method will throw a SecurityException, and the current
KeyboardFocusManager will be unchanged.
Sets the default focus traversal keys for a given traversal operation.
This traversal key
Set
will be in effect on all
Window
s that have no such
Set
of
their own explicitly defined. This
Set
will also be
inherited, recursively, by any child
Component
of
those
Windows
that has
no such
Set
of its own explicitly defined.
The default values for the default focus traversal keys are
implementation-dependent. Sun recommends that all implementations for a
particular native platform use the same default values. The
recommendations for Windows and Unix are listed below. These
recommendations are used in the Sun AWT implementations.
Identifier |
Meaning |
Default |
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS |
Normal forward keyboard traversal |
TAB on KEY_PRESSED ,
CTRL-TAB on KEY_PRESSED |
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS |
Normal reverse keyboard traversal |
SHIFT-TAB on KEY_PRESSED ,
CTRL-SHIFT-TAB on KEY_PRESSED |
KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS |
Go up one focus traversal cycle |
none |
KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS |
Go down one focus traversal cycle |
none |
To disable a traversal key, use an empty
Set
;
Collections.EMPTY_SET
is recommended.
Using the AWTKeyStroke
API, client code can
specify on which of two
specific KeyEvent
s, KEY_PRESSED
or
KEY_RELEASED
, the focus traversal operation will
occur. Regardless of which KeyEvent
is specified,
however, all KeyEvent
s related to the focus
traversal key, including the associated KEY_TYPED
event, will be consumed, and will not be dispatched
to any Component
. It is a runtime error to
specify a KEY_TYPED
event as
mapping to a focus traversal operation, or to map the same event to
multiple default focus traversal operations.
Sets the default FocusTraversalPolicy. Top-level components
use this value on their creation to initialize their own focus traversal
policy by explicit call to Container.setFocusTraversalPolicy.
Note: this call doesn't affect already created components as they have
their policy initialized. Only new components will use this policy as
their default policy.
Sets the current focus cycle root. If the focus owner is itself a focus
cycle root, then it may be ambiguous as to which Components represent
the next and previous Components to focus during normal focus traversal.
In that case, the current focus cycle root is used to differentiate
among the possibilities.
This method is intended to be used only by KeyboardFocusManagers and
focus implementations. It is not for general client use.
Returns a string representation of the object. In general, the
toString
method returns a string that
"textually represents" this object. The result should
be a concise but informative representation that is easy for a
person to read.
It is recommended that all subclasses override this method.
The toString
method for class Object
returns a string consisting of the name of the class of which the
object is an instance, the at-sign character `@
', and
the unsigned hexadecimal representation of the hash code of the
object. In other words, this method returns a string equal to the
value of:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Moves the focus up one focus traversal cycle from the current focus
owner. Typically, the new focus owner is set to the current focus
owner's focus cycle root, and the current focus cycle root is set to the
new focus owner's focus cycle root. If, however, the current focus
owner's focus cycle root is a Window, then typically the focus owner is
set to the focus cycle root's default Component to focus, and the
current focus cycle root is unchanged.
Moves the focus up one focus traversal cycle. Typically, the focus owner
is set to aComponent's focus cycle root, and the current focus cycle
root is set to the new focus owner's focus cycle root. If, however,
aComponent's focus cycle root is a Window, then typically the focus
owner is set to the Window's default Component to focus, and the current
focus cycle root is unchanged.
Causes current thread to wait until another thread invokes the
method or the
method for this object.
In other words, this method behaves exactly as if it simply
performs the call
wait(0).
The current thread must own this object's monitor. The thread
releases ownership of this monitor and waits until another thread
notifies threads waiting on this object's monitor to wake up
either through a call to the notify
method or the
notifyAll
method. The thread then waits until it can
re-obtain ownership of the monitor and resumes execution.
As in the one argument version, interrupts and spurious wakeups are
possible, and this method should always be used in a loop:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
This method should only be called by a thread that is the owner
of this object's monitor. See the
notify
method for a
description of the ways in which a thread can become the owner of
a monitor.
Causes current thread to wait until either another thread invokes the
method or the
method for this object, or a
specified amount of time has elapsed.
The current thread must own this object's monitor.
This method causes the current thread (call it T) to
place itself in the wait set for this object and then to relinquish
any and all synchronization claims on this object. Thread T
becomes disabled for thread scheduling purposes and lies dormant
until one of four things happens:
- Some other thread invokes the notify method for this
object and thread T happens to be arbitrarily chosen as
the thread to be awakened.
- Some other thread invokes the notifyAll method for this
object.
- Some other thread interrupts
thread T.
- The specified amount of real time has elapsed, more or less. If
timeout is zero, however, then real time is not taken into
consideration and the thread simply waits until notified.
The thread
T is then removed from the wait set for this
object and re-enabled for thread scheduling. It then competes in the
usual manner with other threads for the right to synchronize on the
object; once it has gained control of the object, all its
synchronization claims on the object are restored to the status quo
ante - that is, to the situation as of the time that the
wait
method was invoked. Thread
T then returns from the
invocation of the
wait method. Thus, on return from the
wait method, the synchronization state of the object and of
thread
T is exactly as it was when the
wait method
was invoked.
A thread can also wake up without being notified, interrupted, or
timing out, a so-called spurious wakeup. While this will rarely
occur in practice, applications must guard against it by testing for
the condition that should have caused the thread to be awakened, and
continuing to wait if the condition is not satisfied. In other words,
waits should always occur in loops, like this one:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
(For more information on this topic, see Section 3.2.3 in Doug Lea's
"Concurrent Programming in Java (Second Edition)" (Addison-Wesley,
2000), or Item 50 in Joshua Bloch's "Effective Java Programming
Language Guide" (Addison-Wesley, 2001).
If the current thread is
interrupted
by another thread
while it is waiting, then an InterruptedException is thrown.
This exception is not thrown until the lock status of this object has
been restored as described above.
Note that the wait method, as it places the current thread
into the wait set for this object, unlocks only this object; any
other objects on which the current thread may be synchronized remain
locked while the thread waits.
This method should only be called by a thread that is the owner
of this object's monitor. See the notify
method for a
description of the ways in which a thread can become the owner of
a monitor.
Causes current thread to wait until another thread invokes the
method or the
method for this object, or
some other thread interrupts the current thread, or a certain
amount of real time has elapsed.
This method is similar to the wait
method of one
argument, but it allows finer control over the amount of time to
wait for a notification before giving up. The amount of real time,
measured in nanoseconds, is given by:
1000000*timeout+nanos
In all other respects, this method does the same thing as the
method
of one argument. In particular,
wait(0, 0) means the same thing as wait(0).
The current thread must own this object's monitor. The thread
releases ownership of this monitor and waits until either of the
following two conditions has occurred:
- Another thread notifies threads waiting on this object's monitor
to wake up either through a call to the
notify
method
or the notifyAll
method.
- The timeout period, specified by
timeout
milliseconds plus nanos
nanoseconds arguments, has
elapsed.
The thread then waits until it can re-obtain ownership of the
monitor and resumes execution.
As in the one argument version, interrupts and spurious wakeups are
possible, and this method should always be used in a loop:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
}
This method should only be called by a thread that is the owner
of this object's monitor. See the
notify
method for a
description of the ways in which a thread can become the owner of
a monitor.