Every thread has a priority. Threads with higher priority are
executed in preference to threads with lower priority. Each thread
may or may not also be marked as a daemon. When code running in
some thread creates a new Thread object, the new
thread has its priority initially set equal to the priority of the
creating thread, and is a daemon thread if and only if the
creating thread is a daemon.
When a Java Virtual Machine starts up, there is usually a single
non-daemon thread (which typically calls the method named
main of some designated class). The Java Virtual
Machine continues to execute threads until either of the following
occurs:
exit method of class Runtime has been
called and the security manager has permitted the exit operation
to take place.
run method or by
throwing an exception that propagates beyond the run
method.
There are two ways to create a new thread of execution. One is to
declare a class to be a subclass of Thread. This
subclass should override the run method of class
Thread. An instance of the subclass can then be
allocated and started. For example, a thread that computes primes
larger than a stated value could be written as follows:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
The following code would then create a thread and start it running:
PrimeThread p = new PrimeThread(143);
p.start();
The other way to create a thread is to declare a class that
implements the Runnable interface. That class then
implements the run method. An instance of the class can
then be allocated, passed as an argument when creating
Thread, and started. The same example in this other
style looks like the following:
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
The following code would then create a thread and start it running:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
Every thread has a name for identification purposes. More than one thread may have the same name. If a name is not specified when a thread is created, a new name is generated for it.
RunnableRuntime.exit(int)run()stop()millis the length of time to sleep in milliseconds.InterruptedException if any thread has interrupted
the current thread. The interrupted status of the
current thread is cleared when this exception is thrown.Object.notify()millis the length of time to sleep in milliseconds.nanos 0-999999 additional nanoseconds to sleep.IllegalArgumentException if the value of millis is
negative or the value of nanos is not in the range
0-999999.InterruptedException if any thread has interrupted
the current thread. The interrupted status of the
current thread is cleared when this exception is thrown.Object.notify()Thread object. This constructor has
the same effect as Thread(null, target,
gname), where gname is
a newly generated name. Automatically generated names are of the
form "Thread-"+n, where n is an integer.
target the object whose run method is called.Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String) Thread object. This constructor has
the same effect as Thread(group, target,
gname), where gname is
a newly generated name. Automatically generated names are of the
form "Thread-"+n, where n is an integer.
group the thread group.target the object whose run method is called.SecurityException if the current thread cannot create a
thread in the specified thread group.Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String) Thread object. This constructor has
the same effect as Thread(null, null, name).
name the name of the new thread.Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String) Thread object. This constructor has
the same effect as Thread(group, null, name)
group the thread group.name the name of the new thread.SecurityException if the current thread cannot create a
thread in the specified thread group.Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String) Thread object. This constructor has
the same effect as Thread(null, target, name).
target the object whose run method is called.name the name of the new thread.Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String) Thread object so that it has
target as its run object, has the specified
name as its name, and belongs to the thread group
referred to by group.
If group is null and there is a
security manager, the group is determined by the security manager's
getThreadGroup method. If group is
null and there is not a security manager, or the
security manager's getThreadGroup method returns
null, the group is set to be the same ThreadGroup
as the thread that is creating the new thread.
If there is a security manager, its checkAccess
method is called with the ThreadGroup as its argument.
In addition, its checkPermission
method is called with the
RuntimePermission("enableContextClassLoaderOverride")
permission when invoked directly or indirectly by the constructor
of a subclass which overrides the getContextClassLoader
or setContextClassLoader methods.
This may result in a SecurityException.
If the target argument is not null, the
run method of the target is called when
this thread is started. If the target argument is
null, this thread's run method is called
when this thread is started.
The priority of the newly created thread is set equal to the
priority of the thread creating it, that is, the currently running
thread. The method setPriority may be used to
change the priority to a new value.
The newly created thread is initially marked as being a daemon
thread if and only if the thread creating it is currently marked
as a daemon thread. The method setDaemon may be used
to change whether or not a thread is a daemon.
group the thread group.target the object whose run method is called.name the name of the new thread.SecurityException if the current thread cannot create a
thread in the specified thread group or cannot
override the context class loader methods.Runnable.run()run()setDaemon(boolean)setPriority(int)ThreadGroup.checkAccess()SecurityManager.checkAccess(java.lang.Thread)Thread object so that it has
target as its run object, has the specified
name as its name, belongs to the thread group referred to
by group, and has the specified stack size.
This constructor is identical to with the exception of the fact
that it allows the thread stack size to be specified. The stack size
is the approximate number of bytes of address space that the virtual
machine is to allocate for this thread's stack. The effect of the
stackSize parameter, if any, is highly platform dependent.
Thread
On some platforms, specifying a higher value for the
stackSize parameter may allow a thread to achieve greater
recursion depth before throwing a .
Similarly, specifying a lower value may allow a greater number of
threads to exist concurrently without throwing an StackOverflowError (or other internal error). The details of
the relationship between the value of the stackSize parameter
and the maximum recursion depth and concurrency level are
platform-dependent. On some platforms, the value of the
stackSize parameter may have no effect whatsoever.
OutOfMemoryError
The virtual machine is free to treat the stackSize parameter as a suggestion. If the specified value is unreasonably low for the platform, the virtual machine may instead use some platform-specific minimum value; if the specified value is unreasonably high, the virtual machine may instead use some platform-specific maximum. Likewise, the virtual machine is free to round the specified value up or down as it sees fit (or to ignore it completely).
Specifying a value of zero for the stackSize parameter will cause this constructor to behave exactly like the Thread(ThreadGroup, Runnable, String) constructor.
Due to the platform-dependent nature of the behavior of this constructor, extreme care should be exercised in its use. The thread stack size necessary to perform a given computation will likely vary from one JRE implementation to another. In light of this variation, careful tuning of the stack size parameter may be required, and the tuning may need to be repeated for each JRE implementation on which an application is to run.
Implementation note: Java platform implementers are encouraged to document their implementation's behavior with respect to the stackSize parameter.
group the thread group.target the object whose run method is called.name the name of the new thread.stackSize the desired stack size for the new thread, or
zero to indicate that this parameter is to be ignored.SecurityException if the current thread cannot create a
thread in the specified thread group.run method of this thread.
The result is that two threads are running concurrently: the
current thread (which returns from the call to the
start method) and the other thread (which executes its
run method).
It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.
IllegalThreadStateException if the thread was already
started.run()stop()
If there is a security manager installed, its checkAccess
method is called with this
as its argument. This may result in a
SecurityException being raised (in the current thread).
If this thread is different from the current thread (that is, the current
thread is trying to stop a thread other than itself), the
security manager's checkPermission method (with a
RuntimePermission("stopThread") argument) is called in
addition.
Again, this may result in throwing a
SecurityException (in the current thread).
The thread represented by this thread is forced to stop whatever
it is doing abnormally and to throw a newly created
ThreadDeath object as an exception.
It is permitted to stop a thread that has not yet been started. If the thread is eventually started, it immediately terminates.
An application should not normally try to catch
ThreadDeath unless it must do some extraordinary
cleanup operation (note that the throwing of
ThreadDeath causes finally clauses of
try statements to be executed before the thread
officially dies). If a catch clause catches a
ThreadDeath object, it is important to rethrow the
object so that the thread actually dies.
The top-level error handler that reacts to otherwise uncaught
exceptions does not print out a message or otherwise notify the
application if the uncaught exception is an instance of
ThreadDeath.
ThreadDeath exception propagating up the stack). If
any of the objects previously protected by these monitors were in
an inconsistent state, the damaged objects become visible to
other threads, potentially resulting in arbitrary behavior. Many
uses of stop should be replaced by code that simply
modifies some variable to indicate that the target thread should
stop running. The target thread should check this variable
regularly, and return from its run method in an orderly fashion
if the variable indicates that it is to stop running. If the
target thread waits for long periods (on a condition variable,
for example), the interrupt method should be used to
interrupt the wait.
For more information, see
Why
are Thread.stop, Thread.suspend and Thread.resume Deprecated?.SecurityException if the current thread cannot
modify this thread.interrupt()checkAccess()run()start()ThreadDeathThreadGroup.uncaughtException(java.lang.Thread,java.lang.Throwable)SecurityManager.checkAccess(java.lang.Thread)SecurityManager.checkPermission(java.security.Permission)
If there is a security manager installed, the checkAccess
method of this thread is called, which may result in a
SecurityException being raised (in the current thread).
If this thread is different from the current thread (that is, the current
thread is trying to stop a thread other than itself) or
obj is not an instance of ThreadDeath, the
security manager's checkPermission method (with the
RuntimePermission("stopThread") argument) is called in
addition.
Again, this may result in throwing a
SecurityException (in the current thread).
If the argument obj is null, a
NullPointerException is thrown (in the current thread).
The thread represented by this thread is forced to stop
whatever it is doing abnormally and to throw the
Throwable object obj as an exception. This
is an unusual action to take; normally, the stop method
that takes no arguments should be used.
It is permitted to stop a thread that has not yet been started. If the thread is eventually started, it immediately terminates.
stop()
for details. An additional danger of this
method is that it may be used to generate exceptions that the
target thread is unprepared to handle (including checked
exceptions that the thread could not possibly throw, were it
not for this method).
For more information, see
Why
are Thread.stop, Thread.suspend and Thread.resume Deprecated?.obj the Throwable object to be thrown.SecurityException if the current thread cannot modify
this thread.NullPointerException if obj is null.interrupt()checkAccess()run()start()stop()SecurityManager.checkAccess(java.lang.Thread)SecurityManager.checkPermission(java.security.Permission) Unless the current thread is interrupting itself, which is
always permitted, the checkAccess method
of this thread is invoked, which may cause a to be thrown.
SecurityException
If this thread is blocked in an invocation of the , Object.wait()wait(long), or methods of the Object.wait(long,int)
class, or of the Object, join(), join(long), join(long,int), or sleep(long),
methods of this class, then its interrupt status will be cleared and it
will receive an sleep(long,int).
InterruptedException
If this thread is blocked in an I/O operation upon an then the channel will be closed, the thread's interrupt
status will be set, and the thread will receive a java.nio.channels.InterruptibleChannel.
java.nio.channels.ClosedByInterruptException
If this thread is blocked in a
then the thread's interrupt status will be set and it will return
immediately from the selection operation, possibly with a non-zero
value, just as if the selector's java.nio.channels.Selector method were invoked.
java.nio.channels.Selector.wakeup()
If none of the previous conditions hold then this thread's interrupt status will be set.
Interrupting a thread that is not alive need not have any effect.
SecurityException
if the current thread cannot modify this threadA thread interruption ignored because a thread was not alive at the time of the interrupt will be reflected by this method returning false.
true if the current thread has been interrupted;
false otherwise.isInterrupted()A thread interruption ignored because a thread was not alive at the time of the interrupt will be reflected by this method returning false.
true if this thread has been interrupted;
false otherwise.interrupted()NoSuchMethodError.
suspend(). If the target thread held
a lock protecting a critical system resource when it was
destroyed, no thread could ever access this resource again.
If another thread ever attempted to lock this resource, deadlock
would result. Such deadlocks typically manifest themselves as
"frozen" processes. For more information, see
Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.NoSuchMethodError always
First, the checkAccess method of this thread is called
with no arguments. This may result in throwing a
SecurityException (in the current thread).
If the thread is alive, it is suspended and makes no further progress unless and until it is resumed.
resume, deadlock results. Such
deadlocks typically manifest themselves as "frozen" processes.
For more information, see
Why
are Thread.stop, Thread.suspend and Thread.resume Deprecated?.SecurityException if the current thread cannot modify
this thread.checkAccess()
First, the checkAccess method of this thread is called
with no arguments. This may result in throwing a
SecurityException (in the current thread).
If the thread is alive but suspended, it is resumed and is permitted to make progress in its execution.
suspend(),
which has been deprecated because it is deadlock-prone.
For more information, see
Why
are Thread.stop, Thread.suspend and Thread.resume Deprecated?.SecurityException if the current thread cannot modify this
thread.checkAccess()suspend()
First the checkAccess method of this thread is called
with no arguments. This may result in throwing a
SecurityException.
Otherwise, the priority of this thread is set to the smaller of
the specified newPriority and the maximum permitted
priority of the thread's thread group.
newPriority priority to set this thread toIllegalArgumentException If the priority is not in the
range MIN_PRIORITY to
MAX_PRIORITY.SecurityException if the current thread cannot modify
this thread.getPriority()checkAccess()getThreadGroup()MAX_PRIORITYMIN_PRIORITYThreadGroup.getMaxPriority()name.
First the checkAccess method of this thread is called
with no arguments. This may result in throwing a
SecurityException.
name the new name for this thread.SecurityException if the current thread cannot modify this
thread.getName()checkAccess()enumerate method of the current thread's thread
group with the array argument.
First, if there is a security manager, that enumerate
method calls the security
manager's checkAccess method
with the thread group as its argument. This may result
in throwing a SecurityException.
tarray an array of Thread objects to copy toSecurityException if a security manager exists and its
checkAccess method doesn't allow the operation.ThreadGroup.enumerate(java.lang.Thread[])SecurityManager.checkAccess(java.lang.ThreadGroup)suspend(),
which is deprecated. Further, the results of this call
were never well-defined.IllegalThreadStateException if this thread is not
suspended.millis milliseconds for this thread to
die. A timeout of 0 means to wait forever.
millis the time to wait in milliseconds.InterruptedException if any thread has interrupted
the current thread. The interrupted status of the
current thread is cleared when this exception is thrown.millis milliseconds plus
nanos nanoseconds for this thread to die.
millis the time to wait in milliseconds.nanos 0-999999 additional nanoseconds to wait.IllegalArgumentException if the value of millis is negative
the value of nanos is not in the range 0-999999.InterruptedException if any thread has interrupted
the current thread. The interrupted status of the
current thread is cleared when this exception is thrown.InterruptedException if any thread has interrupted
the current thread. The interrupted status of the
current thread is cleared when this exception is thrown.Throwable.printStackTrace()This method must be called before the thread is started.
This method first calls the checkAccess method
of this thread
with no arguments. This may result in throwing a
SecurityException (in the current thread).
on if true, marks this thread as a
daemon thread.IllegalThreadStateException if this thread is active.SecurityException if the current thread cannot modify
this thread.isDaemon()checkAccess()true if this thread is a daemon thread;
false otherwise.setDaemon(boolean)
If there is a security manager, its checkAccess method
is called with this thread as its argument. This may result in
throwing a SecurityException.
SecurityException if the current thread is not allowed to
access this thread.SecurityManager.checkAccess(java.lang.Thread)First, if there is a security manager, and the caller's class
loader is not null and the caller's class loader is not the same as or
an ancestor of the context class loader for the thread whose
context class loader is being requested, then the security manager's
checkPermission
method is called with a
RuntimePermission("getClassLoader") permission
to see if it's ok to get the context ClassLoader..
SecurityException
if a security manager exists and its
checkPermission method doesn't allow
getting the context ClassLoader.setContextClassLoader(java.lang.ClassLoader)SecurityManager.checkPermission(java.security.Permission)RuntimePermissionFirst, if there is a security manager, its checkPermission
method is called with a
RuntimePermission("setContextClassLoader") permission
to see if it's ok to set the context ClassLoader..
cl the context ClassLoader for this ThreadSecurityException if the current thread cannot set the
context ClassLoader.getContextClassLoader()SecurityManager.checkPermission(java.security.Permission)RuntimePermissionThis method is designed to allow a program to assert that the current thread already holds a specified lock:
assert Thread.holdsLock(obj);
obj the object on which to test lock ownershipNullPointerException if obj is nullIf there is a security manager, and this thread is not the current thread, then the security manager's checkPermission method is called with a RuntimePermission("getStackTrace") permission to see if it's ok to get the stack trace.
Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this thread is permitted to return a zero-length array from this method.
SecurityException
if a security manager exists and its
checkPermission method doesn't allow
getting the stack trace of thread.SecurityManager.checkPermission(java.security.Permission)RuntimePermissionThrowable.getStackTrace()getStackTrace method.
The threads may be executing while this method is called. The stack trace of each thread only represents a snapshot and each stack trace may be obtained at different time. A zero-length array will be returned in the map value if the virtual machine has no stack trace information about a thread.
If there is a security manager, then the security manager's checkPermission method is called with a RuntimePermission("getStackTrace") permission as well as RuntimePermission("modifyThreadGroup") permission to see if it is ok to get the stack trace of all threads.
SecurityException
if a security manager exists and its
checkPermission method doesn't allow
getting the stack trace of thread.getStackTrace()SecurityManager.checkPermission(java.security.Permission)RuntimePermissionThrowable.getStackTrace()NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATEDA thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states.
Thread.getState()Object.wait with no timeoutThread.join with no timeoutLockSupport.parkA thread in the waiting state is waiting for another thread to perform a particular action. For example, a thread that has called Object.wait() on an object is waiting for another thread to call Object.notify() or Object.notifyAll() on that object. A thread that has called Thread.join() is waiting for a specified thread to terminate.
When a thread is about to terminate due to an uncaught exception
the Java Virtual Machine will query the thread for its
UncaughtExceptionHandler using
and will invoke the handler's
uncaughtException method, passing the thread and the
exception as arguments.
If a thread has not had its UncaughtExceptionHandler
explicitly set, then its ThreadGroup object acts as its
UncaughtExceptionHandler. If the ThreadGroup object
has no
special requirements for dealing with the exception, it can forward
the invocation to the default uncaught exception handler.
Thread.getUncaughtExceptionHandler()
Uncaught exception handling is controlled first by the thread, then
by the thread's object and finally by the default
uncaught exception handler. If the thread does not have an explicit
uncaught exception handler set, and the thread's thread group
(including parent thread groups) does not specialize its
uncaughtException method, then the default handler's
uncaughtException method will be invoked.
ThreadGroup
By setting the default uncaught exception handler, an application can change the way in which uncaught exceptions are handled (such as logging to a specific device, or file) for those threads that would already accept whatever "default" behavior the system provided.
Note that the default uncaught exception handler should not usually defer to the thread's ThreadGroup object, as that could cause infinite recursion.
eh the object to use as the default uncaught exception handler.
If null then there is no default handler.SecurityException if a security manager is present and it
denies RuntimePermission
("setDefaultUncaughtExceptionHandler")setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)getUncaughtExceptionHandler()ThreadGroup.uncaughtException(java.lang.Thread,java.lang.Throwable)A thread can take full control of how it responds to uncaught exceptions by having its uncaught exception handler explicitly set. If no such handler is set then the thread's ThreadGroup object acts as its handler.
eh the object to use as this thread's uncaught exception
handler. If null then this thread has no explicit handler.SecurityException if the current thread is not allowed to
modify this thread.setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)ThreadGroup.uncaughtException(java.lang.Thread,java.lang.Throwable)