The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available.
See Java Language Changes for a summary of updated language features in Java SE 9 and subsequent releases.
See JDK Release Notes for information about new features, enhancements, and removed or deprecated options for all JDK releases.
The java.util.concurrent
package defines three executor interfaces:
Executor
, a simple interface that supports launching new tasks.ExecutorService
, a subinterface of Executor
, which adds features that help manage the life cycle, both of the individual tasks and of the executor itself.ScheduledExecutorService
, a subinterface of ExecutorService
, supports future and/or periodic execution of tasks.Typically, variables that refer to executor objects are declared as one of these three interface types, not with an executor class type.
Executor
InterfaceThe
Executor
interface provides a single method, execute
, designed to be a drop-in replacement for a common thread-creation idiom. If r
is a Runnable
object, and e
is an Executor
object you can replace
(new Thread(r)).start();
with
e.execute(r);
However, the definition of execute
is less specific. The low-level idiom creates a new thread and launches it immediately. Depending on the Executor
implementation, execute
may do the same thing, but is more likely to use an existing worker thread to run r
, or to place r
in a queue to wait for a worker thread to become available. (We'll describe worker threads in the section on Thread Pools.)
The executor implementations in java.util.concurrent
are designed to make full use of the more advanced ExecutorService
and ScheduledExecutorService
interfaces, although they also work with the base Executor
interface.
ExecutorService
InterfaceThe
ExecutorService
interface supplements execute
with a similar, but more versatile submit
method. Like execute
, submit
accepts Runnable
objects, but also accepts
Callable
objects, which allow the task to return a value. The submit
method returns a
Future
object, which is used to retrieve the Callable
return value and to manage the status of both Callable
and Runnable
tasks.
ExecutorService
also provides methods for submitting large collections of Callable
objects. Finally, ExecutorService
provides a number of methods for managing the shutdown of the executor. To support immediate shutdown, tasks should handle interrupts correctly.
ScheduledExecutorService
InterfaceThe
ScheduledExecutorService
interface supplements the methods of its parent ExecutorService
with schedule
, which executes a Runnable
or Callable
task after a specified delay. In addition, the interface defines scheduleAtFixedRate
and scheduleWithFixedDelay
, which executes specified tasks repeatedly, at defined intervals.