The
Concurrent API Packages
The concurrency utilities are
contained in the java.util.concurrent
package and in its two subpackages: java.util.concurrent.atomic
and java.util.concurrent.locks. A brief
overview of their contents is given here.
java.util.concurrent
java.util.concurrent defines the core features that support
alternatives to the built-in approaches
to synchronization and interthread communication. It defines the following key
features:
Synchronizers
Executors
Concurrent collections
The Fork/Join Framework
Synchronizers offer high-level ways of synchronizing the interactions between
multiple threads. The synchronizer
classes defined by java.util.concurrent
are
Semaphore : Implements the
classic semaphore.
CountDownLatch : Waits until
a specified number of events have occurred.
CyclicBarrier : Enables a
group of threads to wait at a predefined execution point.
Exchanger : Exchanges data
between two threads.
Phaser : Synchronizes threads
that advance through multiple phases of an operation.
Notice that each synchronizer
provides a solution to a specific type of synchronization problem. This enables
each synchronizer to be optimized for its intended use. In the past, these
types of synchronization objects had to be crafted by hand. The concurrent API
standardizes them and makes them available to all Java programmers.
Executors manage thread execution. At the top of the executor hierarchy is
the Executor interface, which
is used to initiate a thread. ExecutorService
extends Executor and provides
methods that manage execution. There are three implementations of ExecutorService:
ThreadPoolExecutor,
ScheduledThreadPoolExecutor, and
ForkJoinPool. java.util.concurrent also
defines the Executors utility class,
which includes a number of static methods that simplify the creation of various
executors.
Related to executors are the Future and Callable interfaces. A Future
contains a value that is returned by a thread after it executes. Thus, its value
becomes defined “in the future,” when the thread terminates. Callable defines a thread that returns
a value.
java.util.concurrent defines several concurrent collection classes,
including
ConcurrentHashMap,
ConcurrentLinkedQueue, and
CopyOnWriteArrayList. These offer concurrent
alternatives to their related classes defined by the Collections Framework.
The Fork/Join Framework supports parallel programming. Its main classes
are ForkJoinTask,
ForkJoinPool, RecursiveTask, and RecursiveAction.
Finally, to better handle
thread timing, java.util.concurrent
defines the TimeUnit enumeration.
java.util.concurrent.atomic
java.util.concurrent.atomic facilitates the use of variables in a
concurrent environment. It provides
a means of efficiently updating the value of a variable without the use of
locks. This is accomplished through the use of classes, such as AtomicInteger and AtomicLong, and methods, such as compareAndSet( ), decrementAndGet(
), and getAndSet( ). These
methods execute as a single, non-interruptible operation.
java.util.concurrent.locks
java.util.concurrent.locks provides an alternative to the use of
synchronized methods. At the core of
this alternative is the Lock
interface, which defines the basic mechanism used to acquire and relinquish
access to an object. The key methods are lock(
), tryLock( ), and unlock( ). The advantage to using these
methods is greater control over synchronization.
The remainder of this chapter
takes a closer look at the constituents of the concurrent API.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.