T - the type of the object managed by this initializer classpublic class BackgroundInitializer<T> extends AbstractConcurrentInitializer<T,Exception>
Applications often have to do some expensive initialization steps when they are started, e.g. constructing a connection to a database, reading a configuration file, etc. Doing these things in parallel can enhance performance as the CPU load can be improved. However, when access to the resources initialized in a background thread is actually required, synchronization has to be performed to ensure that their initialization is complete.
This abstract base class provides support for this use case. A concrete
subclass must implement the AbstractConcurrentInitializer.initialize() method. Here an arbitrary
initialization can be implemented, and a result object can be returned. With
this method in place the basic usage of this class is as follows (where
MyBackgroundInitializer is a concrete subclass):
MyBackgroundInitializer initializer = new MyBackgroundInitializer(); initializer.start(); // Now do some other things. Initialization runs in a parallel thread ... // Wait for the end of initialization and access the result object Object result = initializer.get();
After the construction of a BackgroundInitializer object its
start() method has to be called. This starts the background
processing. The application can now continue to do other things. When it
needs access to the object produced by the BackgroundInitializer it
calls its get() method. If initialization is already complete,
get() returns the result object immediately. Otherwise it blocks
until the result object is fully constructed.
BackgroundInitializer is a thin wrapper around a Future
object and uses an ExecutorService for running the background
initialization task. It is possible to pass in an ExecutorService at
construction time or set one using setExternalExecutor() before
start() was called. Then this object is used to spawn the background
task. If no ExecutorService has been provided, BackgroundInitializer creates a temporary ExecutorService and
destroys it when initialization is complete.
The methods provided by BackgroundInitializer provide for minimal
interaction with the wrapped Future object. It is also possible to
obtain the Future object directly. Then the enhanced functionality
offered by Future can be used, e.g. to check whether the background
operation is complete or to cancel the operation.
| Modifier and Type | Class and Description |
|---|---|
static class |
BackgroundInitializer.Builder<I extends BackgroundInitializer<T>,T>
Builds a new instance.
|
AbstractConcurrentInitializer.AbstractBuilder<I extends AbstractConcurrentInitializer<T,E>,T,B extends AbstractConcurrentInitializer.AbstractBuilder<I,T,B,E>,E extends Exception>NUL| Modifier | Constructor and Description |
|---|---|
protected |
BackgroundInitializer()
Creates a new instance of
BackgroundInitializer. |
protected |
BackgroundInitializer(ExecutorService exec)
Creates a new instance of
BackgroundInitializer and initializes
it with the given ExecutorService. |
| Modifier and Type | Method and Description |
|---|---|
static <T> BackgroundInitializer.Builder<BackgroundInitializer<T>,T> |
builder()
Creates a new builder.
|
T |
get()
Gets the result of the background initialization.
|
protected ExecutorService |
getActiveExecutor()
Gets the
ExecutorService that is actually used for executing
the background task. |
ExecutorService |
getExternalExecutor()
Gets the external
ExecutorService to be used by this class. |
Future<T> |
getFuture()
|
protected int |
getTaskCount()
Gets the number of background tasks to be created for this
initializer.
|
protected Exception |
getTypedException(Exception e)
Gets an Exception with a type of E as defined by a concrete subclass of this class.
|
boolean |
isInitialized()
Tests whether this instance is initialized.
|
boolean |
isStarted()
Tests whether this
BackgroundInitializer has already
been started. |
void |
setExternalExecutor(ExecutorService externalExecutor)
Sets an
ExecutorService to be used by this class. |
boolean |
start()
Starts the background initialization.
|
close, initializeclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitnulprotected BackgroundInitializer()
BackgroundInitializer. No external
ExecutorService is used.protected BackgroundInitializer(ExecutorService exec)
BackgroundInitializer and initializes
it with the given ExecutorService. If the ExecutorService
is not null, the background task for initializing this object will be
scheduled at this service. Otherwise a new temporary ExecutorService is created.exec - an external ExecutorService to be used for task.
executionpublic static <T> BackgroundInitializer.Builder<BackgroundInitializer<T>,T> builder()
T - the type of object to build.public T get() throws ConcurrentException
InterruptedException are wrapped in a
ConcurrentException. Calling this method before start()
was called causes an IllegalStateException exception to be
thrown.ConcurrentException - if a checked exception occurred during
background processing.IllegalStateException - if start() has not been called.protected final ExecutorService getActiveExecutor()
ExecutorService that is actually used for executing
the background task. This method can be called after start()
(before start() it returns null). If an external executor
was set, this is also the active executor. Otherwise this method returns
the temporary executor that was created by this object.ExecutorService for executing the background task.public final ExecutorService getExternalExecutor()
ExecutorService to be used by this class.ExecutorService.public Future<T> getFuture()
Future object that was created when start()
was called. Therefore this method can only be called after start().Future object wrapped by this initializer.IllegalStateException - if start() has not been called.protected int getTaskCount()
ExecutorService is created. This base implementation returns 1. Derived
classes that do more complex background processing can override it. This
method is called from a synchronized block by the start()
method. Therefore overriding methods should be careful with obtaining
other locks and return as fast as possible.protected Exception getTypedException(Exception e)
getTypedException in class AbstractConcurrentInitializer<T,Exception>e - The actual exception that was thrownpublic boolean isInitialized()
isInitialized in class AbstractConcurrentInitializer<T,Exception>public boolean isStarted()
BackgroundInitializer has already
been started.start() method has already been
called.public final void setExternalExecutor(ExecutorService externalExecutor)
ExecutorService to be used by this class. The ExecutorService passed to this method is used for executing the
background task. Thus it is possible to re-use an already existing
ExecutorService or to use a specially configured one. If no
ExecutorService is set, this instance creates a temporary one and
destroys it after background initialization is complete. Note that this
method must be called before start(); otherwise an exception is
thrown.externalExecutor - the ExecutorService to be used.IllegalStateException - if this initializer has already been
started.public boolean start()
AbstractConcurrentInitializer.initialize() method in a
background task. A BackgroundInitializer can be started exactly
once. The return value of this method determines whether the start was
successful: only the first invocation of this method returns true,
following invocations will return false.Copyright © 2001–2025 The Apache Software Foundation. All rights reserved.