JAVA 8 Parallel Stream
第五組:蔡詠捷、王登文、游憶文
outline
• Java 8 Lambda Expression
• Stream & Parallel Stream
• Code Demo
• Java Fork and Join using ForkJoinPool(Java7)
• Conclusion
Java 8 Lambda Expression
Lambda Expression
• Java 8 support Lambda Expression then officially support functional
programming paradigm
• Lambda comes from the Lambda Calculus and refers to anonymous
functions in programming
• Lambda Expression
• Method argument 必須為一個 Functional Interface
• Functional Interface : Single Abstract Method interface(SAM interface)
• Ex : java.lang.Runnable, java.util.Comparator
Lambda Expression
• Functional Interface 定義:只有一個 public abstract method 的 Java
Interface
• 取代Functional Interface所產出的匿名類別,簡化程式碼
Lambda Expression
• @FunctionalInterface Annotation
Stream
• Stream 是一個Collection Wrapper,可以讓把集合內的元素 ( Elements ) 以
串流 ( Stream ) 形式交到 Stream Methods 以 Lambda Expression 執行
• Stream 執行時期如同 Iterator,單向而不可往返,資料只讀取一次,讀取過一
次後即用盡了
Stream
• Lazy evalutation
• JVM 在沒有遇到 terminal operations 前,並不會執行任何 Stream method
• Short-circuit execution
• JVM 會自行判斷 short-circuit,提早完成集合元素遍歷 ( Element traversal )
• Automatic parallelism
• JVM 可以把 Java Lambda Streams 同時交給多核心處理器 ( Multi-Core )或多線程
(Multi-Thread) 來執行,無須去編寫任何多線程代碼
Stream
• Lazy evaluation
• Code example
Stream
• Short circuit example
• ( fn1() || fn2() )
• if fn1() is true , fn2() will not execute
• ( fn1() && fn2() )
• if fn1() is false , fn2() will not execute
Stream
• Collection support
• Array support
Parallel Stream
• 直接將 Stream() 改為 ParallelStream()
• 要視硬體及JVM配置與JVM負載而定
• 也有可能造成負面作用(Side-effect)
Code Demo
Example Background
https://www.dropbox.com/s/dyx9rpxj53ofyxb/%E8%9E%A2%E5
%B9%95%E6%88%AA%E5%9C%96%202015-11-
01%2000.19.44.png?dl=0
Let’s look some examples~
In Java7, We do that......
https://www.dropbox.com/s/dyx9rpxj53ofyxb/%E8%9E%A2%E5
%B9%95%E6%88%AA%E5%9C%96%202015-11-
01%2000.19.44.png?dl=0
In Java8, We just need!
We can easily change to Parallel
Java Fork and Join using ForkJoinPool
Fork
• each subtask can be executed in parallel by different CPUs, or
different threads on the same CPU.
• The limit for when it makes sense to fork a task into subtasks is
also called a threshold. It is up to each task to decide on a sensible
threshold. It depends very much on the kind of work being done.
Join
Once the subtasks have finished
executing, the task may join (merge) all
the results into one result.
ForkJoinPool
A special thread pool which is designed to work well with
fork-and-join task splitting.
Example:As a parameter to the ForkJoinPool constructor
you pass the indicated level of parallelism you desire.
ForkJoinPool forkJoinPool = new ForkJoinPool(8);
As a parameter to the ForkJoinPool constructor you pass
the indicated level of parallelism you desire.
ForkJoinPool
You can submit two types of tasks. RecursiveAction and
RecursiveTask.
Action won’t return any result, just compute but task will return
something.
ForkJoinPool
You can submit two types of tasks. RecursiveAction and
RecursiveTask.
Action won’t return any result, just compute but task will return
something.
Use case:
MyRecursiveAction myRecursiveAction = new MyRecursiveAction(24);
forkJoinPool.invoke(myRecursiveAction);
Advanced Topic: http://coopsoft.com/ar/CalamityArticle.html
Parallel Stream is good or
not good?
Discuss Parallel Stream Good and Bad
Parallel Stream Problem
• Java 8 parallel streams 也許會讓
程式跑得更快,或者不會,甚至是
跑的更慢
• streams 方法以低成本達到平行處
理(parallel processing)的方便性,
but they do almost in a ‘Black
Box’
• parallel processing 並非等同於
concurrent processing. 但許多在
Java8中「automatic
parallelization」範例 裡事實上都
是concurrent processing.
Concurrent Processing VS Parallel Processing
Streams Good for
• They allow functional
programming style using
bindings.
• They allow for better
performance by removing
iteration. Iteration occurs with
evaluation. With streams, we can
bind dozens of functions without
iterating.
• Streams may be infinite.
Functions may be bound to
infinite streams without problem.
=>a short circuiting operation
And Not Good For
• All streams use the same
ForkJoinPool=>very long
running task=> many long
running sub-tasks => use
each thread in pool
• one parallel subtask
performing I/O has side
effects on others
• Not many threads running at
the same time, and in
particular no other parallel
stream
使用Stream 建議
• 適合使用
• 需在多核心的CPU下執行才能表現效能
• 無I/O存取下
• 切割Pool & Num Setting
• Collection,Array…
• 不適合使用
• 需在單核心的CPU下執行效能差
• I/O存取佔執行之大部份作業下
• 建議:
• 不使用Default ForkJoin Pool(除非在執行作業的Task及伺服器設定可容許…)
結論
• Parallel Stream 看似方便、好處多,但背後有多少問題是我們還沒發現的?
• Parallel streams 是不可預知的,難以最正確的方式在運作.
• 大部份使用Parallel Stream時無法預知可能會影響到正在 運作不相關的程式的
執行效能。
• 在請「parallel Stream」來時,請三思而後行(除非功力深厚OR…)
Reference
• https://dzone.com/articles/think-twice-using-java-8
• http://zeroturnaround.com/rebellabs/java-parallel-streams-are-bad-for-your-health/
• http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/
• https://wefollownews.appspot.com/cittopnews201408_48/14848.html
• http://openhome.cc/Gossip/Java/ParallelStream.html
• http://www.slideshare.net/dgomezg/parallel-streams-en-java-
8http://www.slideshare.net/JustinSDK/java-se-8-lambda
• http://magiclen.org/java-8-lambda/http://developer.51cto.com/art/201311/417451.htm
• Custom Thread Pool 參考 : http://stackoverflow.com/questions/21163108/custom-thread-
pool-in-java-8-parallel-stream
• ForkJoinPool submit, execute, invoke :
http://stackoverflow.com/questions/17881183/difference-between-execute-submit-and-
invoke-in-a-forkjoinpool

Java 8 parallel stream

  • 1.
    JAVA 8 ParallelStream 第五組:蔡詠捷、王登文、游憶文
  • 2.
    outline • Java 8Lambda Expression • Stream & Parallel Stream • Code Demo • Java Fork and Join using ForkJoinPool(Java7) • Conclusion
  • 3.
    Java 8 LambdaExpression
  • 5.
    Lambda Expression • Java8 support Lambda Expression then officially support functional programming paradigm • Lambda comes from the Lambda Calculus and refers to anonymous functions in programming • Lambda Expression • Method argument 必須為一個 Functional Interface • Functional Interface : Single Abstract Method interface(SAM interface) • Ex : java.lang.Runnable, java.util.Comparator
  • 7.
    Lambda Expression • FunctionalInterface 定義:只有一個 public abstract method 的 Java Interface • 取代Functional Interface所產出的匿名類別,簡化程式碼
  • 8.
  • 9.
    Stream • Stream 是一個CollectionWrapper,可以讓把集合內的元素 ( Elements ) 以 串流 ( Stream ) 形式交到 Stream Methods 以 Lambda Expression 執行 • Stream 執行時期如同 Iterator,單向而不可往返,資料只讀取一次,讀取過一 次後即用盡了
  • 10.
    Stream • Lazy evalutation •JVM 在沒有遇到 terminal operations 前,並不會執行任何 Stream method • Short-circuit execution • JVM 會自行判斷 short-circuit,提早完成集合元素遍歷 ( Element traversal ) • Automatic parallelism • JVM 可以把 Java Lambda Streams 同時交給多核心處理器 ( Multi-Core )或多線程 (Multi-Thread) 來執行,無須去編寫任何多線程代碼
  • 11.
  • 12.
    Stream • Short circuitexample • ( fn1() || fn2() ) • if fn1() is true , fn2() will not execute • ( fn1() && fn2() ) • if fn1() is false , fn2() will not execute
  • 13.
  • 14.
    Parallel Stream • 直接將Stream() 改為 ParallelStream() • 要視硬體及JVM配置與JVM負載而定 • 也有可能造成負面作用(Side-effect)
  • 15.
  • 16.
  • 17.
    Let’s look someexamples~ In Java7, We do that...... https://www.dropbox.com/s/dyx9rpxj53ofyxb/%E8%9E%A2%E5 %B9%95%E6%88%AA%E5%9C%96%202015-11- 01%2000.19.44.png?dl=0
  • 18.
    In Java8, Wejust need!
  • 19.
    We can easilychange to Parallel
  • 20.
    Java Fork andJoin using ForkJoinPool
  • 21.
    Fork • each subtaskcan be executed in parallel by different CPUs, or different threads on the same CPU. • The limit for when it makes sense to fork a task into subtasks is also called a threshold. It is up to each task to decide on a sensible threshold. It depends very much on the kind of work being done.
  • 22.
    Join Once the subtaskshave finished executing, the task may join (merge) all the results into one result.
  • 23.
    ForkJoinPool A special threadpool which is designed to work well with fork-and-join task splitting. Example:As a parameter to the ForkJoinPool constructor you pass the indicated level of parallelism you desire. ForkJoinPool forkJoinPool = new ForkJoinPool(8); As a parameter to the ForkJoinPool constructor you pass the indicated level of parallelism you desire.
  • 24.
    ForkJoinPool You can submittwo types of tasks. RecursiveAction and RecursiveTask. Action won’t return any result, just compute but task will return something.
  • 25.
    ForkJoinPool You can submittwo types of tasks. RecursiveAction and RecursiveTask. Action won’t return any result, just compute but task will return something.
  • 26.
    Use case: MyRecursiveAction myRecursiveAction= new MyRecursiveAction(24); forkJoinPool.invoke(myRecursiveAction); Advanced Topic: http://coopsoft.com/ar/CalamityArticle.html
  • 27.
    Parallel Stream isgood or not good? Discuss Parallel Stream Good and Bad
  • 28.
    Parallel Stream Problem •Java 8 parallel streams 也許會讓 程式跑得更快,或者不會,甚至是 跑的更慢 • streams 方法以低成本達到平行處 理(parallel processing)的方便性, but they do almost in a ‘Black Box’ • parallel processing 並非等同於 concurrent processing. 但許多在 Java8中「automatic parallelization」範例 裡事實上都 是concurrent processing.
  • 29.
    Concurrent Processing VSParallel Processing
  • 30.
    Streams Good for •They allow functional programming style using bindings. • They allow for better performance by removing iteration. Iteration occurs with evaluation. With streams, we can bind dozens of functions without iterating. • Streams may be infinite. Functions may be bound to infinite streams without problem. =>a short circuiting operation
  • 31.
    And Not GoodFor • All streams use the same ForkJoinPool=>very long running task=> many long running sub-tasks => use each thread in pool • one parallel subtask performing I/O has side effects on others • Not many threads running at the same time, and in particular no other parallel stream
  • 32.
    使用Stream 建議 • 適合使用 •需在多核心的CPU下執行才能表現效能 • 無I/O存取下 • 切割Pool & Num Setting • Collection,Array… • 不適合使用 • 需在單核心的CPU下執行效能差 • I/O存取佔執行之大部份作業下 • 建議: • 不使用Default ForkJoin Pool(除非在執行作業的Task及伺服器設定可容許…)
  • 33.
    結論 • Parallel Stream看似方便、好處多,但背後有多少問題是我們還沒發現的? • Parallel streams 是不可預知的,難以最正確的方式在運作. • 大部份使用Parallel Stream時無法預知可能會影響到正在 運作不相關的程式的 執行效能。 • 在請「parallel Stream」來時,請三思而後行(除非功力深厚OR…)
  • 34.
    Reference • https://dzone.com/articles/think-twice-using-java-8 • http://zeroturnaround.com/rebellabs/java-parallel-streams-are-bad-for-your-health/ •http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ • https://wefollownews.appspot.com/cittopnews201408_48/14848.html • http://openhome.cc/Gossip/Java/ParallelStream.html • http://www.slideshare.net/dgomezg/parallel-streams-en-java- 8http://www.slideshare.net/JustinSDK/java-se-8-lambda • http://magiclen.org/java-8-lambda/http://developer.51cto.com/art/201311/417451.htm • Custom Thread Pool 參考 : http://stackoverflow.com/questions/21163108/custom-thread- pool-in-java-8-parallel-stream • ForkJoinPool submit, execute, invoke : http://stackoverflow.com/questions/17881183/difference-between-execute-submit-and- invoke-in-a-forkjoinpool