applying java functional programming features: starting ... · •understand how java functional...

22
Applying Java Functional Programming Features: Starting & Joining Threads Douglas C. Schmidt [email protected] www.dre.vanderbilt.edu/~schmidt Professor of Computer Science Institute for Software Integrated Systems Vanderbilt University Nashville, Tennessee, USA

Upload: others

Post on 19-Aug-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

Applying Java Functional Programming

Features: Starting & Joining Threads

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: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

2

Learning Objectives in this Part of the Lesson• Understand how Java functional

programming features are applied in a simple parallel program

• Know how to start & join Java threads via functional programming features

“MacBeth”“Hamlet”

“JuliusCaesar”

“KingLear”

Page 3: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

3

Example of Starting & Joining Java Threads

Page 4: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

4

• Showcases Java FP features

Example of Starting & Joining Java Threadspublic void run() {

See ThreadJoinTest/updated/src/main/java/ThreadJoinTest.java

Page 5: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

5

• Showcases Java FP features

Example of Starting & Joining Java Threadspublic void run() {

Start a group of threads that search for phrases in parallel

“MacBeth”“Hamlet”

“JuliusCaesar”

“KingLear”

Page 6: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

6

• Showcases Java FP features

Example of Starting & Joining Java Threadspublic void run() {

See docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

“MacBeth”“Hamlet”

“JuliusCaesar”

“KingLear” A Java thread is a unit of

computation that runs in the context of a process

Page 7: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

7

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

...

Factory method makes a list of worker threads

Example of Starting & Joining Java Threads

Page 8: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

8

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

...

Void processInput(String input)

{ ... }

List<Thread> makeWorkerThreads

(Function<String, Void> task)

{ ... }

This method searches for phrases in one work of Shakespeare

Example of Starting & Joining Java Threads

Page 9: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

9

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

...

This functional interface makes it easy to change the function

passed to factory method

Void processInput(String input)

{ ... }

List<Thread> makeWorkerThreads

(Function<String, Void> task)

{ ... }

Example of Starting & Joining Java Threads

Page 10: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

10

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Apply a function lambda to create runnable for a thread

List<Thread> makeWorkerThreads

(Function<String, Void> task) {

List<Thread> workerThreads =

new ArrayList<>();

mInputList.forEach(input ->

workerThreads.add

(new Thread(()

-> task.apply(input))));

return workerThreads;

}This factory method creates a

list of threads that will be joined when their processing is done

Example of Starting & Joining Java Threads

Page 11: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

11

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Apply a function lambda to create runnable for a thread

List<Thread> makeWorkerThreads

(Function<String, Void> task) {

List<Thread> workerThreads =

new ArrayList<>();

mInputList.forEach(input ->

workerThreads.add

(new Thread(()

-> task.apply(input))));

return workerThreads;

}Create an empty list of threads

Example of Starting & Joining Java Threads

Page 12: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

12

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Apply a function lambda to create runnable for a thread

List<Thread> makeWorkerThreads

(Function<String, Void> task) {

List<Thread> workerThreads =

new ArrayList<>();

mInputList.forEach(input ->

workerThreads.add

(new Thread(()

-> task.apply(input))));

return workerThreads;

}Create a thread for each input string to perform processing

designated by the task parameter

Example of Starting & Joining Java Threads

Page 13: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

13

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Apply a function lambda to create runnable for a thread

List<Thread> makeWorkerThreads

(Function<String, Void> task) {

List<Thread> workerThreads =

new ArrayList<>();

mInputList.forEach(input ->

workerThreads.add

(new Thread(()

-> task.apply(input))));

return workerThreads;

}task.apply() creates a runnable that provides the computation

for each of the threads

Example of Starting & Joining Java Threads

Page 14: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

14

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Apply a function lambda to create runnable for a thread

List<Thread> makeWorkerThreads

(Function<String, Void> task) {

List<Thread> workerThreads =

new ArrayList<>();

mInputList.forEach(input ->

workerThreads.add

(new Thread(()

-> task.apply(input))));

return workerThreads;

}

Add each new thread to the list

Example of Starting & Joining Java Threads

Page 15: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

15

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Apply a function lambda to create runnable for a thread

List<Thread> makeWorkerThreads

(Function<String, Void> task) {

List<Thread> workerThreads =

new ArrayList<>();

mInputList.forEach(input ->

workerThreads.add

(new Thread(()

-> task.apply(input))));

return workerThreads;

}

Return the list of worker threads

Example of Starting & Joining Java Threads

Page 16: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

16

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Start worker threads via forEach() & a method reference

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

workerThreads

.forEach(Thread::start);

...

Example of Starting & Joining Java Threads

Each worker thread has its own runtime call stack

See en.wikipedia.org/wiki/Call_stack

Page 17: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

17

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Start worker threads via forEach() & a method reference

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

workerThreads

.forEach(Thread::start);

...

forEach() & method referencestart each worker thread to search

for phrases in works of Shakespeare

Example of Starting & Joining Java Threads

Page 18: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

18

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Start worker threads via forEach() & a method reference

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

workerThreads

.forEach(Thread::start);

...

This program uses a “thread-per-work” parallelism model

“MacBeth”“Hamlet”

“JuliusCaesar”

“KingLear”

Example of Starting & Joining Java Threads

Page 19: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

19

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Start worker threads via forEach() & a method reference

• Wait for worker threads to finish

Uses forEach() & lambda expression

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

workerThreads

.forEach(Thread::start);

workerThreads

.forEach(thread -> {

... thread.join(); ...

} ...

Example of Starting & Joining Java Threads

Page 20: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

20See en.wikipedia.org/wiki/Barrier_(computer_science)

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Start worker threads via forEach() & a method reference

• Wait for worker threads to finish

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

workerThreads

.forEach(Thread::start);

workerThreads

.forEach(thread -> {

... thread.join(); ...

} ...

Simple form of barrier synchronization

Example of Starting & Joining Java Threads

Page 21: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

21

• Showcases Java FP features, e.g.

• Flexibly create worker threads via a factory method

• Pass a reference to a method expecting a functional interface

• Start worker threads via forEach() & a method reference

• Wait for worker threads to finish

public void run() {

List<Thread> workerThreads =

makeWorkerThreads

(this::processInput);

workerThreads

.forEach(Thread::start);

workerThreads

.forEach(thread -> {

... thread.join(); ...

} ...

No other Java synchronizers are needed!

Example of Starting & Joining Java Threads

Page 22: Applying Java Functional Programming Features: Starting ... · •Understand how Java functional programming features are applied in a simple parallel program •Know how to start

22

End of Applying Java Functional Programming

Features: Starting & Joining Threads