20
Java ExecutorCompletionService: Introduction Douglas C. Schmidt [email protected] www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville, Tennessee, USA

Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

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

Page 2: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

2

Learning Objectives in this Part of the Lesson• Understand how Java CompletionService’s interface defines

a framework for handling the completion of async tasks

-completion

Queue

0..n

-executor

Page 3: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

3

Learning Objectives in this Part of the Lesson• Understand how Java CompletionService’s interface defines

a framework for handling the completion of async tasks

• Know how to instantiate the JavaExecutorCompletionService

mExecutorService =

Executors.newFixedThreadPool

(Runtime

.getRuntime

.availableProcessors());

mExecutorCompletionService =

new ExecutorCompletionService<>

(mExecutorService);

Page 4: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

4

Motivating the Java CompletionService Interface

Page 5: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

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

Page 6: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

6

• CompletionService fixes this problem via an “asynchronous future” processing model

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

Page 7: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

7

Overview of the Java CompletionService Interface

Page 8: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

8

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

Page 9: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

9

• 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

Page 10: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

10

-completion

Queue

0..n

-executor

which contains 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

Page 11: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

11See 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

Page 12: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

12

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

Page 13: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

13See 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”

Page 14: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

14

• 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

Page 15: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

15

Instantiating the JavaExecutorCompletionService

Page 16: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

16

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

Page 17: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

17

• 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

Page 18: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

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);

Create an executor service whose thread pool size matches the # of cores

Instantiating the Java ExecutorCompletionService

Page 19: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

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);

Associate ExecutorCompletionService with executor service

Instantiating the Java ExecutorCompletionService

Page 20: Java ExecutorCompletionService: Introductionschmidt/cs891s/2019-PDFs/L4-Java-Execut… · Java ExecutorCompletionService: Introduction Douglas C. Schmidt ... thread, even if some

20

End of the Java Executor CompletionService:

Introduction