Parallel Execution

The ParallelExecutor allows a computation to occur in parallel.

It can be used in two ways. First, with an explicit Future:

   Future<String> future = executor.invoke(new Invokable<String>() { ... });

The executor will submit the Invokable to a thread pool for execution in the background.

The ultimate value of the Invokable is available from invoking get() on the Future; this will block until the value is ready.

Other methods on Future can cancel the execution, or get the value only if it is ready within a timeout.

The thread pool is started automatically as needed, and will shutdown when the Registry itself is shutdown.

Another alternative will return an object, not a Future:

  RSSFeed feed = executor.invoke(RSSFeed.class, new Invokable<RSSFeed>() { ... });

This only works if the type is an interface. A proxy for the interface is created around the Future object; any invocation on the proxy will invoke get() on the Future.

Configuration

Configuraton symbols are defined in IOCSymbols.

tapestry.thread-pool-enabled
If "true", the default, then the thread pool will operate. If "false", then ParallelExecutor's implementation changes to invoke the Invokable immediately, not in a pooled thread.
tapestry.thread-pool.core-pool-size
Minimum size of the thread pool. Defaults to 3.
tapestry.thread-pool.max-pool-size
Maximum number of threads (active or inactive) in the thread pool. Defaults to 20.
tapestry.thread-pool.keep-alive
Time to keep waiting threads alive. Defaults to "1 m" (one minute).