Class MultiBackgroundInitializer
- java.lang.Object
-
- org.apache.commons.lang3.concurrent.BackgroundInitializer<MultiBackgroundInitializer.MultiBackgroundInitializerResults>
-
- org.apache.commons.lang3.concurrent.MultiBackgroundInitializer
-
- All Implemented Interfaces:
ConcurrentInitializer<MultiBackgroundInitializer.MultiBackgroundInitializerResults>
public class MultiBackgroundInitializer extends BackgroundInitializer<MultiBackgroundInitializer.MultiBackgroundInitializerResults>
A specialized
BackgroundInitializer
implementation that can deal with multiple background initialization tasks.This class has a similar purpose as
BackgroundInitializer
. However, it is not limited to a single background initialization task. Rather it manages an arbitrary number ofBackgroundInitializer
objects, executes them, and waits until they are completely initialized. This is useful for applications that have to perform multiple initialization tasks that can run in parallel (i.e. that do not depend on each other). This class takes care about the management of anExecutorService
and shares it with theBackgroundInitializer
objects it is responsible for; so the using application need not bother with these details.The typical usage scenario for
MultiBackgroundInitializer
is as follows:- Create a new instance of the class. Optionally pass in a pre-configured
ExecutorService
. AlternativelyMultiBackgroundInitializer
can create a temporaryExecutorService
and delete it after initialization is complete. - Create specialized
BackgroundInitializer
objects for the initialization tasks to be performed and add them to theMultiBackgroundInitializer
using theaddInitializer(String, BackgroundInitializer)
method. - After all initializers have been added, call the
BackgroundInitializer.start()
method. - When access to the result objects produced by the
BackgroundInitializer
objects is needed call theBackgroundInitializer.get()
method. The object returned here provides access to all result objects created during initialization. It also stores information about exceptions that have occurred.
MultiBackgroundInitializer
starts a special controller task that starts allBackgroundInitializer
objects added to the instance. Before the an initializer is started it is checked whether this initializer already has anExecutorService
set. If this is the case, thisExecutorService
is used for running the background task. Otherwise the currentExecutorService
of thisMultiBackgroundInitializer
is shared with the initializer.The easiest way of using this class is to let it deal with the management of an
ExecutorService
itself: If no externalExecutorService
is provided, the class creates a temporaryExecutorService
(that is capable of executing all background tasks in parallel) and destroys it at the end of background processing.Alternatively an external
ExecutorService
can be provided - either at construction time or later by calling theBackgroundInitializer.setExternalExecutor(ExecutorService)
method. In this case all background tasks are scheduled at this externalExecutorService
. Important note: When using an externalExecutorService
be sure that the number of threads managed by the service is large enough. Otherwise a deadlock can happen! This is the case in the following scenario:MultiBackgroundInitializer
starts a task that starts all registeredBackgroundInitializer
objects and waits for their completion. If for instance a single threadedExecutorService
is used, none of the background tasks can be executed, and the task created byMultiBackgroundInitializer
waits forever.- Since:
- 3.0
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
MultiBackgroundInitializer.MultiBackgroundInitializerResults
A data class for storing the results of the background initialization performed byMultiBackgroundInitializer
.
-
Constructor Summary
Constructors Constructor Description MultiBackgroundInitializer()
Creates a new instance ofMultiBackgroundInitializer
.MultiBackgroundInitializer(java.util.concurrent.ExecutorService exec)
Creates a new instance ofMultiBackgroundInitializer
and initializes it with the given externalExecutorService
.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addInitializer(java.lang.String name, BackgroundInitializer<?> backgroundInitializer)
Adds a newBackgroundInitializer
to this object.protected int
getTaskCount()
Returns the number of tasks needed for executing all childBackgroundInitializer
objects in parallel.protected MultiBackgroundInitializer.MultiBackgroundInitializerResults
initialize()
Creates the results object.-
Methods inherited from class org.apache.commons.lang3.concurrent.BackgroundInitializer
get, getActiveExecutor, getExternalExecutor, getFuture, isStarted, setExternalExecutor, start
-
-
-
-
Constructor Detail
-
MultiBackgroundInitializer
public MultiBackgroundInitializer()
Creates a new instance ofMultiBackgroundInitializer
.
-
MultiBackgroundInitializer
public MultiBackgroundInitializer(java.util.concurrent.ExecutorService exec)
Creates a new instance ofMultiBackgroundInitializer
and initializes it with the given externalExecutorService
.- Parameters:
exec
- theExecutorService
for executing the background tasks
-
-
Method Detail
-
addInitializer
public void addInitializer(java.lang.String name, BackgroundInitializer<?> backgroundInitializer)
Adds a newBackgroundInitializer
to this object. When thisMultiBackgroundInitializer
is started, the given initializer will be processed. This method must not be called afterBackgroundInitializer.start()
has been invoked.- Parameters:
name
- the name of the initializer (must not be null)backgroundInitializer
- theBackgroundInitializer
to add (must not be null)- Throws:
java.lang.IllegalArgumentException
- if a required parameter is missingjava.lang.IllegalStateException
- ifstart()
has already been called
-
getTaskCount
protected int getTaskCount()
Returns the number of tasks needed for executing all childBackgroundInitializer
objects in parallel. This implementation sums up the required tasks for all child initializers (which is necessary if one of the child initializers is itself aMultiBackgroundInitializer
). Then it adds 1 for the control task that waits for the completion of the children.- Overrides:
getTaskCount
in classBackgroundInitializer<MultiBackgroundInitializer.MultiBackgroundInitializerResults>
- Returns:
- the number of tasks required for background processing
-
initialize
protected MultiBackgroundInitializer.MultiBackgroundInitializerResults initialize() throws java.lang.Exception
Creates the results object. This implementation starts all childBackgroundInitializer
objects. Then it collects their results and creates aMultiBackgroundInitializerResults
object with this data. If a child initializer throws a checked exceptions, it is added to the results object. Unchecked exceptions are propagated.- Specified by:
initialize
in classBackgroundInitializer<MultiBackgroundInitializer.MultiBackgroundInitializerResults>
- Returns:
- the results object
- Throws:
java.lang.Exception
- if an error occurs
-
-