public interface TaskExecutor extends AutoCloseable
TaskExecutor
is recommended to be used in image
processing algorithms instead of ExecutorService
.
It's simpler to use, and allows single threaded execution.
// Example of a multi threaded method that fills an image with ones.
public void fillWithOnes( RandomAccessibleInterval< IntType > image, TaskExecutor taskExecutor )
{
int numTasks = taskExecutor.suggestNumberOfTasks();
List< RandomAccessibleInterval< IntType > > chunks = splitImageIntoChunks( image, numTasks );
// The TaskExecutor executes the forEach method in multi threads, if requested.
taskExecutor.forEach( chunks, chunk -> {
for ( IntType pixel : Views.iterable( chunk ) )
pixel.setOne();
} );
}
// The method can be run multi threaded or single threaded
fillWithOnes( image, TaskExecutors.singleThreaded() );
fillWithOnes( image, TaskExecutors.multiThreaded() );
Modifier and Type | Method and Description |
---|---|
void |
close() |
<T> void |
forEach(List<? extends T> parameters,
Consumer<? super T> task)
Like
runAll(List) but - instead of a list of tasks - it takes
a list of parameters and a function that is called for each of
the parameters. |
<T,R> List<R> |
forEachApply(List<? extends T> parameters,
Function<? super T,? extends R> task)
Like
forEach(List, Consumer) but collects the results. |
ExecutorService |
getExecutorService()
Get the underlying
ExecutorService . |
int |
getParallelism()
Get the number of threads that are used for execution.
|
void |
runAll(List<Runnable> tasks)
This method will execute the given list of tasks.
|
int |
suggestNumberOfTasks()
If there is a big task that could be split into sub tasks
for parallelization, this method gives you a reasonable number
of sub tasks.
|
int getParallelism()
int suggestNumberOfTasks()
A single threaded TaskExecutor
will return 1.
A multi threaded TaskExecutor
will usually return 4 times
the number of threads.
void runAll(List<Runnable> tasks)
TaskExecutor
will execute the tasks one after the
other. A multi threaded TaskExecutor
will distribute the
tasks to the threads. The method blocks until all tasks are completed.<T> void forEach(List<? extends T> parameters, Consumer<? super T> task)
runAll(List)
but - instead of a list of tasks - it takes
a list of parameters and a function that is called for each of
the parameters.<T,R> List<R> forEachApply(List<? extends T> parameters, Function<? super T,? extends R> task)
forEach(List, Consumer)
but collects the results.ExecutorService getExecutorService()
ExecutorService
. This is not always a
fully functional ExecutorService
: Especially the methods
ExecutorService.shutdown()
and
ExecutorService.awaitTermination(long, TimeUnit)
must not be
used.void close()
close
in interface AutoCloseable
Copyright © 2015–2022 ImgLib2. All rights reserved.