Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vaclav Pech on GPars
Search
Enterprise Java User Group Austria
March 05, 2012
Technology
0
38
Vaclav Pech on GPars
Enterprise Java User Group Austria
March 05, 2012
Tweet
Share
More Decks by Enterprise Java User Group Austria
See All by Enterprise Java User Group Austria
Gerrit Grunwald on What the CRaC... SUPERFAST JVM STARTUP
ejug
2
120
Spring Framework 5.2 - Core Container Revisited
ejug
0
130
Andreas Caternberg on Jenkins Pipelines
ejug
0
620
Martin Ahrer on Continuous Delivery Infrastructure With Docker
ejug
0
130
Dirk Mahler on Software Analyse mit jQAssistant & Neo4j
ejug
1
260
Christoph Strobl on Spring Data & Hypermedia
ejug
0
93
Stefan Armbruster on Graph Modelling Antipatterns
ejug
1
100
Stefan Armbruster on Introduction into Neo4J
ejug
1
81
Michael Nitschinger on Building a reactive Couchbase driver for the JVM
ejug
0
110
Other Decks in Technology
See All in Technology
ネットワーク保護はどう変わるのか?re:Inforce 2025最新アップデート解説
tokushun
0
150
Oracle Cloud Infrastructure:2025年6月度サービス・アップデート
oracle4engineer
PRO
2
310
Yamla: Rustでつくるリアルタイム性を追求した機械学習基盤 / Yamla: A Rust-Based Machine Learning Platform Pursuing Real-Time Capabilities
lycorptech_jp
PRO
4
170
解析の定理証明実践@Lean 4
dec9ue
1
200
Node-REDのFunctionノードでMCPサーバーの実装を試してみた / Node-RED × MCP 勉強会 vol.1
you
PRO
0
130
Lambda Web Adapterについて自分なりに理解してみた
smt7174
5
140
KubeCon + CloudNativeCon Japan 2025 Recap
ren510dev
1
300
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
26k
製造業からパッケージ製品まで、あらゆる領域をカバー!生成AIを利用したテストシナリオ生成 / 20250627 Suguru Ishii
shift_evolve
PRO
1
160
生成AI活用の組織格差を解消する 〜ビジネス職のCursor導入が開発効率に与えた好循環〜 / Closing the Organizational Gap in AI Adoption
upamune
5
4.6k
Lazy application authentication with Tailscale
bluehatbrit
0
110
AWS Organizations 新機能!マルチパーティ承認の紹介
yhana
1
220
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Practical Orchestrator
shlominoach
188
11k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
A Tale of Four Properties
chriscoyier
160
23k
Music & Morning Musume
bryan
46
6.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
720
Transcript
GPars Promises to keep Václav Pech
About me ['Passionate programmer', 'Concurrency enthusiast', 'GPars lead', 'Developer/technology evangelist
@ JetBrains' ].eachParallel {say it} http://www.jroller.com/vaclav http://twitter.com/vaclav_pech
We're all parallel now Use them or leave them!
None
# of cores
# of cores Today Soon
Dealing with threads sucks! public class Counter { private static
long count = 0; public Counter() { count++; } }
Dealing with threads sucks! public class Counter { private static
long count = 0; public Counter() { synchronized (this) { count++; } } }
Dealing with threads sucks! public class Counter { private static
long count = 0; public Counter() { synchronized (this.getClass()) { count++; } } }
Dealing with threads sucks! public class ClickCounter implements ActionListener {
public ClickCounter(JButton button) { button.addActionListener(this); } public void actionPerformed(final ActionEvent e) { ... } }
images.eachParallel {it.process()} documents.sumParallel() candidates.maxParallel {it.salary}.marry() Parallel Collections
Parallel Collections progLanguages.parallel.filter {it.concurrent} .max {it.javaInteroperability} .map {it.logo} ==
Fork/Join Solve hierarchical problems Divide and conquer
Merge sort, Quick sort Tree traversal File scan / search … [a, b, c, d, e, f, g, h] [a, b, c, d] [e, f, g, h] [a, b] [c, d] [e, f] [g, h]
Thread Pool Tasks Worker threads Queue
Thread Pool Contention!
Fork/Join Thread Pool
Fork/Join Thread Pool Work stealing
Languages are either concurrent or obsolete.
Java 5 Asynchronous calculations
Java 7 Asynchronous calculations Fork/Join
Java 8 Asynchronous calculations Fork/Join Parallel collections
Scala Asynchronous calculations Fork/Join Parallel collections Actors
Clojure Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm
Oz Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm Dataflow
Google's Go Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm
Dataflow CSP
Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm Dataflow CSP
Asynchronous calculations Fork/Join Parallel collections Actors Agents, Stm Dataflow CSP
Agenda
Actors Processes with a mail-box Share no data Communicate by
sending messages Use a thread-pool
Stateless Actors (pure Java) class MyActor extends DynamicDispatchActor { Account
account = ... public void onMessage(String msg) { String encripted = encrypt(msg); reply(encripted); } public void onMessage(Integer number) { reply(2 * number); } public void onMessage(Money cash) { System.out.println("Received a donation " + cash); account.deposit(cash); } }
Active Objects @ActiveObject class MyCounter { private int counter =
0 @ActiveMethod def incrementBy(int value) { println "Received an integer: $value" this.counter += value } }
Composing async functions int hash1 = hash(download('http://www.gpars.org')) int hash2 =
hash(loadFile('/gpars/website/index.html')) boolean result = compare(hash1, hash2) println result
Composing async functions @AsyncFun hash = oldHash @AsyncFun compare =
oldCompare @AsyncFun download = oldDownload @AsyncFun loadFile = oldLoadFile def hash1 = hash(download('http://www.gpars.org')) def hash2 = hash(loadFile('/gpars/website/index.html')) def result = compare(hash1, hash2) println result.get()
Composing async functions @AsyncFun hash = oldHash @AsyncFun(blocking = true)
compare = oldCompare @AsyncFun download = oldDownload @AsyncFun loadFile = oldLoadFile def hash1 = hash(download('http://www.gpars.org')) def hash2 = hash(loadFile('/gpars/website/index.html')) boolean result = compare(hash1, hash2) println result
int hash(String text) {…} Promise<int> hash(Promise<String> | String text)
int hash(String text) {…} Promise<int> hash(Promise<String> | String text) compare(
hash( download() ), hash( loadFile() ) )
int hash(String text) {…} Promise<int> hash(Promise<String> | String text) {
1.Return a Promise for the result 2.Wait (non-blocking) for the text param 3.Call the original hash() 4.Bind the result }
Composing async functions Combine functions as usual Parallelism is detected
automatically
Dataflow Concurrency No race-conditions No live-locks Deterministic
deadlocks Completely deterministic programs BEAUTIFUL code (Jonas Bonér)
Dataflow Variables / Promises main task2 task3 x y z
task1
Dataflows def df = new Dataflows() task { df.z =
df.x + df.y } task { df.x = 10 } task { println ”I am task 3” df.y = 5 } assert 15 == df.z
operator(inputs: [headers, bodies, footers], outputs: [articles, summaries]) {header, body, footer
-> def article = buildArticle(header, body, footer) bindOutput(0, article) bindOutput(1, buildSummary(article)) } * + <> Dataflow Operators
Url resolver Url resolver Downloader Groovy scanner Scala scanner Url
resolver Url resolver Reporter Speculator Evaluator Splitter Confirm Cache updates Approvals Dataflow Operators
None
'coz concurrency is Groovy Find more at: http://gpars.codehaus.org http://www.jroller.com/vaclav http://twitter.com/vaclav_pech
GPars