Class Parallelization
- java.lang.Object
-
- net.imglib2.parallel.Parallelization
-
public final class Parallelization extends java.lang.ObjectThis class allows to configure an algorithm for parallelization.The algorithm needs to use the
TaskExecutorreturned bygetTaskExecutor()to implement the parallelization. Alternatively it can usegetExecutorService(). ButTaskExecutoris simpler and better suited for image precessing algorithms.The algorithm can be executed singleThreaded, multiThreaded or by using a specified
ExecutorServiceorTaskExecutor:// Single-threaded call Parallelization.runSingleThreaded( () -> myAlgorithm( image ) ); // Multi-threaded call Parallelization.runMultiThreaded( () -> myAlgorithm( image ) ); // ExecutorService Parallelization.withExecutor( executorService, () -> myAlgorithm( image ) ); // Multi-threaded is the default. // A normal function call, that's not somehow wrapped by // Parallelization.runSingleThreaded( ... ) runs multi-threaded. myAlgorithm( image ); // Example Algorithm, that fills an image with ones. public void myAlgorithm( RandomAccessibleInterval< IntType > image ) { TaskExecutor taskExecutor = Parallelization.getTaskExecutor(); int numTasks = taskExecutor.suggestNumberOfTasks(); List< Interval > chunks = IntervalChunks.chunkInterval( image, numTasks ); // The TaskExecutor executes the forEach method in multiple threads, if requested. taskExecutor.forEach( chunks, chunk -> { for ( IntType pixel : Views.interval( image, chunk ) ) pixel.setOne(); } ); }
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static interfaceParallelization.Frame
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.ThreadLocal<TaskExecutor>executor
-
Constructor Summary
Constructors Modifier Constructor Description privateParallelization()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static java.util.concurrent.ExecutorServicegetExecutorService()static TaskExecutorgetTaskExecutor()Returns theTaskExecutorthat was set for this thread.static voidrunMultiThreaded(java.lang.Runnable action)To run an algorithm multi-threaded use:static <T> TrunMultiThreaded(java.util.concurrent.Callable<T> action)To run an algorithm multi-threaded use:static voidrunSingleThreaded(java.lang.Runnable action)To run an algorithm single-threaded use:static <T> TrunSingleThreaded(java.util.concurrent.Callable<T> action)To run an algorithm single-threaded use:static voidrunWithExecutor(java.util.concurrent.ExecutorService executorService, java.lang.Runnable action)Executes the givenRunnablewith the givenExecutorService, and waits for the execution to finish.static <R> RrunWithExecutor(java.util.concurrent.ExecutorService executorService, java.util.concurrent.Callable<R> action)Executes the givenCallablewith the givenExecutorService, waits for the execution to finish and returns the result.static voidrunWithExecutor(TaskExecutor taskExecutor, java.lang.Runnable action)Executes the givenRunnablewith the givenTaskExecutor, and waits for the execution to finish.static <T> TrunWithExecutor(TaskExecutor taskExecutor, java.util.concurrent.Callable<T> action)Executes the givenCallablewith the givenTaskExecutor, waits for the execution to finish and returns the result.static voidrunWithNumThreads(int numThreads, java.lang.Runnable action)To run an algorithm a given number of threads use:static <R> RrunWithNumThreads(int numThreads, java.util.concurrent.Callable<R> action)To run an algorithm a given number of threads use:(package private) static Parallelization.FramesetExecutorRequiresReset(TaskExecutor taskExecutor)This method can be used to execute an algorithm with a givenTaskExecutor.
-
-
-
Field Detail
-
executor
private static final java.lang.ThreadLocal<TaskExecutor> executor
-
-
Method Detail
-
getTaskExecutor
public static TaskExecutor getTaskExecutor()
Returns theTaskExecutorthat was set for this thread.
-
getExecutorService
public static java.util.concurrent.ExecutorService getExecutorService()
-
runSingleThreaded
public static void runSingleThreaded(java.lang.Runnable action)
To run an algorithm single-threaded use:Parallelization.runSingleThreaded( () -> myAlgorithm( input ) );
-
runSingleThreaded
public static <T> T runSingleThreaded(java.util.concurrent.Callable<T> action)
To run an algorithm single-threaded use:output = Parallelization.runSingleThreaded( () -> myAlgorithm( input ) );
-
runMultiThreaded
public static void runMultiThreaded(java.lang.Runnable action)
To run an algorithm multi-threaded use:Parallelization.runMultiThreaded( () -> myAlgorithm( input ) );
-
runMultiThreaded
public static <T> T runMultiThreaded(java.util.concurrent.Callable<T> action)
To run an algorithm multi-threaded use:output = Parallelization.runMultiThreaded( () -> myAlgorithm( input ) );
-
runWithNumThreads
public static void runWithNumThreads(int numThreads, java.lang.Runnable action)To run an algorithm a given number of threads use:Parallelization.runWithNumThreads( numThreads, () -> myAlgorithm( input ) );
-
runWithNumThreads
public static <R> R runWithNumThreads(int numThreads, java.util.concurrent.Callable<R> action)To run an algorithm a given number of threads use:output = Parallelization.runWithNumThreads( numThreads, () -> myAlgorithm( input ) );
-
runWithExecutor
public static void runWithExecutor(java.util.concurrent.ExecutorService executorService, java.lang.Runnable action)Executes the givenRunnablewith the givenExecutorService, and waits for the execution to finish.
-
runWithExecutor
public static <R> R runWithExecutor(java.util.concurrent.ExecutorService executorService, java.util.concurrent.Callable<R> action)Executes the givenCallablewith the givenExecutorService, waits for the execution to finish and returns the result.
-
runWithExecutor
public static void runWithExecutor(TaskExecutor taskExecutor, java.lang.Runnable action)
Executes the givenRunnablewith the givenTaskExecutor, and waits for the execution to finish.
-
runWithExecutor
public static <T> T runWithExecutor(TaskExecutor taskExecutor, java.util.concurrent.Callable<T> action)
Executes the givenCallablewith the givenTaskExecutor, waits for the execution to finish and returns the result.
-
setExecutorRequiresReset
static Parallelization.Frame setExecutorRequiresReset(TaskExecutor taskExecutor)
This method can be used to execute an algorithm with a givenTaskExecutor. But it's easier to userunWithExecutor(java.util.concurrent.ExecutorService, java.lang.Runnable).This method sets the
TaskExecutorfor the current thread. This can be used to execute a certain part of your code with the givenTaskExecutor. It's mandatory to call theclose()of the returnframeafterwards. This could be done using an try-with-resources statement.
Or by explicitly callingtry ( Parallelization.Frame frame = Parallelization.setExecutorRequiresReset( taskExecutor ) ) { myAlgorithm(input); }frame.close()in the finally block.Parallelization.Frame frame = Parallelization.setExecutorRequiresReset( taskExecutor ); try { myAlgorithm(input); } finally { frame.close(); }
-
-