Java ExecutorCompletionService: Introductionschmidt/cs891s/2020-PDFs/7...7 •CompletionService...
Transcript of Java ExecutorCompletionService: Introductionschmidt/cs891s/2020-PDFs/7...7 •CompletionService...
Java ExecutorCompletionService:
Introduction
Douglas C. [email protected]
www.dre.vanderbilt.edu/~schmidt
Professor of Computer Science
Institute for Software
Integrated Systems
Vanderbilt University
Nashville, Tennessee, USA
2
Learning Objectives in this Part of the Lesson• Understand how Java CompletionService’s interface defines a framework for
submitting async taks & handling their completion
-completion
Queue
0..n
-executor
3
Learning Objectives in this Part of the Lesson• Understand how Java CompletionService’s interface defines a framework for
submitting async taks & handling their completion
• Know how to instantiate the JavaExecutorCompletionService
mExecutorService =
Executors.newFixedThreadPool
(Runtime
.getRuntime
.availableProcessors());
mExecutorCompletionService =
new ExecutorCompletionService<>
(mExecutorService);
4
Motivating the Java CompletionService Interface
5
• One problem with the ExecutorService implementation of the PrimeCheckerapp is that the future submit() returned must be handled synchronously
Motivating the Java CompletionService Interface
...
private class FutureRunnable
implements Runnable {
List<Future<PrimeCallable.PrimeResult>>
mFutures;
MainActivity mActivity; ...
public void run() {
mFutures.forEach(future -> {
PrimeCallable.PrimeResult pr =
rethrowSupplier(future::get)
.get();
...
This blocking problem is common w/the “synchronous future” processing model
future::get may block the thread, even if some other
futures may have completed
6
• CompletionService fixes this problem via an “async future” processing model that combines an executor with an (internal) blocking queue
ThreadPoolExecutor
WorkerThreads
execute() run()
3.take()
4.run()
5.done()
Future
Future
Future
Future
Completion
Queue
Queueing
Future
WorkQueue
Queueing
Future
Queueing
Future
2.offer()
ExecutorCompletionService
submit()
take()
6.add()
1.submit(task)
7.take()
Queueing
Future
Two-way task results are stored in a completion queue & can be processed immediately
Motivating the Java CompletionService Interface
7
• CompletionService fixes this problem via an “async future” processing model that combines an executor with an (internal) blocking queue
ThreadPoolExecutor
WorkerThreads
execute() run()
3.take()
4.run()
5.done()
Future
Future
Future
Future
Completion
Queue
Queueing
Future
WorkQueue
Queueing
Future
Queueing
Future
2.offer()
ExecutorCompletionService
submit()
take()
6.add()
1.submit(task)
7.take()
Queueing
Future
1+ client threads can submit tasks & 1+ client threads can process their results
Motivating the Java CompletionService Interface
8
Overview of the Java CompletionService Interface
9
Overview of the Java CompletionService Interface
See docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionService.html
-completion
Queue
0..n
-executor
• The CompletionService interface decouples async task invocation from the processing of completed task results
10
• The CompletionService interface decouples async task invocation from the processing of completed task results
• Implemented via the ExecutorCompletionService class
Overview of the Java CompletionService Interface
-completion
Queue
0..n
-executor
See docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorCompletionService.html
11
-completion
Queue
0..n
-executor
This class contains both an Executor & a BlockingQueue
Overview of the Java CompletionService Interface• The CompletionService interface decouples async task
invocation from the processing of completed task results
• Implemented via the ExecutorCompletionService class
12See docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html
Overview of the Java CompletionService Interface
-completion
Queue
0..n
-executor
• The CompletionService interface decouples async task invocation from the processing of completed task results
• Implemented via the ExecutorCompletionService class
An Executor runs tasks in a pool of threads
13
Overview of the Java CompletionService Interface
-completion
Queue
0..n
-executor
• The CompletionService interface decouples async task invocation from the processing of completed task results
• Implemented via the ExecutorCompletionService class
Completed tasks are put blocking queue accessed via take()/poll()
See docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html
14See src/share/classes/java/util/concurrent/ExecutorCompletionService.java
Overview of the Java CompletionService Interface
-completion
Queue
0..n
-executor
• The CompletionService interface decouples async task invocation from the processing of completed task results
• Implemented via the ExecutorCompletionService class
Extends FutureTask to queue a task when it’s “done”
15
• CompletionService can implement the Proactor pattern
See en.wikipedia.org/wiki/Proactor_pattern
Overview of the Java CompletionService Interface
Supports demultiplexing & dispatching of event handlers that are triggered by the completion of async events
16
Instantiating the JavaExecutorCompletionService
17
Instantiating the Java ExecutorCompletionService• ExecutorCompletionService implements CompletionService
& uses an executor to execute tasks placed on a blocking queue when they complete
See docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorCompletionService.html
-completion
Queue
0..n
-executor
18
• A program typically creates an Executor (or ExecutorService) instance & then associates it with a new ExecutorCompletionService
mExecutorService =
Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors());
mExecutorCompletionService =
new ExecutorCompletionService<>(mExecutorService);
Instantiating the Java ExecutorCompletionService
19
• A program typically creates an Executor (or ExecutorService) instance & then associates it with a new ExecutorCompletionService
mExecutorService =
Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors());
mExecutorCompletionService =
new ExecutorCompletionService<>(mExecutorService);
Create an executor service whose thread pool size matches the # of cores
Instantiating the Java ExecutorCompletionService
20
• A program typically creates an Executor (or ExecutorService) instance & then associates it with a new ExecutorCompletionService
mExecutorService =
Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors());
mExecutorCompletionService =
new ExecutorCompletionService<>(mExecutorService);
Associate ExecutorCompletionService with executor service
Instantiating the Java ExecutorCompletionService
21
End of Java Executor CompletionService:
Introduction