public class ParallelExecutor extends Object
Caution: Avoid using another executor within parallelized calls, this would create numerous threads, leading to much memory consumption and huge overhead for thread switching. It is recommended to parallelize the outermost-scoped tasks.
Constructor and Description |
---|
ParallelExecutor()
Creates an instance using default concurrency number, which is the
number of available processors returned by
|
ParallelExecutor(int concurrency)
Creates an instance with a specified concurrency number.
|
ParallelExecutor(String executorName)
Creates an instance with a specified executor name.
|
ParallelExecutor(String executorName,
int concurrency)
Creates an instance with a specified concurrency number, and a name of
the executor.
|
Modifier and Type | Method and Description |
---|---|
<T> void |
conditionalForEach(boolean conditionToParallelize,
Iterable<T> iterable,
IterationBody<T> body)
|
void |
conditionalForLoop(boolean conditionToParallelize,
int start,
int end,
int increment,
LoopBody body)
Runs a parallel for-loop only if
conditionToParallelize is true . |
void |
conditionalForLoop(boolean conditionToParallelize,
int start,
int end,
LoopBody body)
Calls
conditionalForLoop
with increment of 1. |
<T> List<T> |
executeAll(Callable<T>... tasks)
Executes an arbitrary number of
Callable tasks, and returns a
list of results in the same order. |
<T> List<T> |
executeAll(List<? extends Callable<T>> tasks)
Executes a list of
Callable tasks, and returns a list of results
in the same sequential order as tasks . |
<T> T |
executeAny(Callable<T>... tasks)
Executes a list of tasks in parallel, and returns the result from the
earliest successfully completed tasks (without throwing an exception).
|
<T> T |
executeAny(List<? extends Callable<T>> tasks)
Executes a list of tasks in parallel, and returns the result from the
earliest successfully completed tasks (without throwing an exception).
|
<T> void |
forEach(Iterable<T> iterable,
IterationBody<T> body)
Runs a "foreach" loop in parallel.
|
void |
forLoop(int start,
int end,
int increment,
LoopBody body)
Runs a for-loop in parallel.
|
void |
forLoop(int start,
int end,
LoopBody body)
Calls
forLoop
with increment of 1. |
int |
getConcurrency()
Returns the number of threads used for parallel execution.
|
static ParallelExecutor |
getSharedInstance()
Gets the globally shared executor.
|
void |
shutdown()
Shuts down the executor gracefully.
|
public ParallelExecutor()
Runtime.getRuntime().availableProcessors()
public ParallelExecutor(String executorName)
executorName
- the executor name (for debug purpose)public ParallelExecutor(int concurrency)
concurrency
- the maximum number of threads can be used when executing a list of taskspublic ParallelExecutor(String executorName, int concurrency)
executorName
- the executor name (for debug purpose)concurrency
- the maximum number of threads can be used when executing a list of taskspublic static ParallelExecutor getSharedInstance()
public void shutdown()
public int getConcurrency()
public <T> List<T> executeAll(List<? extends Callable<T>> tasks) throws MultipleExecutionException
Callable
tasks, and returns a list of results
in the same sequential order as tasks
.T
- the type of resultstasks
- the list of tasksMultipleExecutionException
- if one or more tasks throws an exceptionpublic <T> List<T> executeAll(Callable<T>... tasks) throws MultipleExecutionException
Callable
tasks, and returns a
list of results in the same order. This is a convenient method and is the
same as calling:
executeAll(Arrays.<Callable<T>>asList(tasks));
T
- the type of resultstasks
- the list of tasksMultipleExecutionException
- if one or more tasks throws an exceptionpublic <T> T executeAny(List<? extends Callable<T>> tasks) throws ExecutionException
T
- the type of resultstasks
- the list of tasksExecutionException
- if no task successfully completespublic <T> T executeAny(Callable<T>... tasks) throws ExecutionException
executeAny(Arrays.<Callable<T>>asList(tasks));
T
- the type of resultstasks
- the list of tasksExecutionException
- if no task successfully completespublic void forLoop(int start, int end, LoopBody body) throws MultipleExecutionException
forLoop
with increment
of 1.start
- the first loop index (inclusive)end
- the last loop index (exclusive)body
- the loop bodyMultipleExecutionException
- if one or more partitioned for-loop throws an exceptionpublic void forLoop(int start, int end, int increment, LoopBody body) throws MultipleExecutionException
for (int i = start; i < end; i += increment) {
body.run(i);
}
start
- the first loop index (inclusive)end
- the last loop index (exclusive)increment
- the increment of the loop index in each iterationbody
- the loop bodyMultipleExecutionException
- if one or more partitioned for-loop throws an exceptionpublic void conditionalForLoop(boolean conditionToParallelize, int start, int end, int increment, LoopBody body) throws MultipleExecutionException
conditionToParallelize
is true
.
Otherwise, the loop body will be executed in a single thread.conditionToParallelize
- the condition to parallelize the for-loop executionstart
- the first loop index (inclusive)end
- the last loop index (exclusive)increment
- the increment of the loop index in each iterationbody
- the loop bodyMultipleExecutionException
- if one or more partitioned for-loop throws an exceptionpublic void conditionalForLoop(boolean conditionToParallelize, int start, int end, LoopBody body) throws MultipleExecutionException
conditionalForLoop
with increment
of 1.conditionToParallelize
- the condition to parallelize the for-loop executionstart
- the first loop index (inclusive)end
- the last loop index (exclusive)body
- the loop bodyMultipleExecutionException
- if one or more partitioned for-loop throws an exceptionpublic <T> void forEach(Iterable<T> iterable, IterationBody<T> body) throws MultipleExecutionException
for (T item : collection) {
body.run(item);
}
T
- data type of elements in iterable
iterable
- the Iterable
collectionbody
- the loop bodyMultipleExecutionException
- if one or more threads throws an exceptionpublic <T> void conditionalForEach(boolean conditionToParallelize, Iterable<T> iterable, IterationBody<T> body) throws MultipleExecutionException
forEach
only if conditionToParallelize
is true
.
Otherwise, the loop body will be executed in a single thread.T
- data type of elements in iterable
conditionToParallelize
- the condition to parallelize the "foreach" executioniterable
- the Iterable
collectionbody
- the loop bodyMultipleExecutionException
- if one or more threads throws an exceptionCopyright © 2010-2020 NM FinTech Ltd.. All Rights Reserved.