Parallelism in Java

20 views
Skip to first unread message

LiTTle

unread,
Feb 8, 2013, 5:56:28 AM2/8/13
to jh...@googlegroups.com
Καλημέρα σε όλους,

Είπα να ασχοληθώ λίγο με τα features της Java 7 σχετικά με τα Threads. Μελετώντας στο Fork/Join Framework, την κλάσση RecursiveTask, έχω την εξής ερώτηση σχετικά με τον κώδικα του συγκεκριμένου υπερσυνδέσμου (http://www.developer.com/imagesvr_ce/9147/join-fork-image003.png).

Το πρόβλημα υπάρχει στις εξής γραμμές:
myWorker1.fork();
result = myWorker2.compute() + myWorker1.join();

Φαντάζομαι οτι η κλήση της compute γίνεται για να πετύχουμε αναδρομή. Η join για να μαζέψει τα αποτελέσματα της fork. Όμως η fork γιατί καλείται? Αν κάνω κάπου λάθος διορθώστε με, απλά έτσι τα έχω καταλάβει!
Δηλαδή, αν αντί για αυτές τις 2 γραμμές είχαμε γράψει "result = myWorker1.compute() + myWorker2.compute();" τι θα χάναμε?

Stelios Gerogiannakis

unread,
Feb 8, 2013, 6:16:47 AM2/8/13
to jh...@googlegroups.com
Η fork() καλείται για να μπορέσεις να υπολογίσεις το άλλο μισό του προβλήματος ασύγχρονα/παράλληλα.

Κάθε κληση της compute() σπάει το πρόβλημα στα 2 κ κάνει schedule το άλλο μισό του προβλήματος.

Αν απλά κάνεις compute() + compute() τότε κάνεις recursion μέσα στο ίδιο thread κ ουσιστικά υπολογίζεις το πρόβλημα σειριακά.

Σπάζοντας το σε κομμάτια τότε εκμεταλλεύεσαι όλα το CPU cores παράλληλα, οπότε θεωρητικά σε ένα μηχάνημα με 8 cores θα το έλυνες σε 1/8 του χρόνου (στην πράξη λιγότερο γιατί δεν είσαι μόνος στο μηχάνημα)

Ελπίζω να σε βοήθησα.

Σ. 


2013/2/8 LiTTle <littl...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "jhug" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jhug+uns...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Thomas Pliakas

unread,
Feb 8, 2013, 6:23:12 AM2/8/13
to jh...@googlegroups.com
Check this link ...
   http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

"The fork() method allows a ForkJoinTask to be planned for asynchronous execution. This allows a new ForkJoinTask to be launched from an existing one."

Εξηγεί αρκετά καλά την χρήση και την λειτουργία του Fork/Join.

Χαιρετώ
Θωμάς

2013/2/8 Stelios Gerogiannakis <sger...@gmail.com>

Markos Charatzas

unread,
Feb 8, 2013, 6:46:19 AM2/8/13
to jh...@googlegroups.com
Ο Heinz Kabutz έκανε ένα σχετικό hands on πριν 2 μέρες στο JFokus

Evangelos Pappas

unread,
Feb 8, 2013, 7:12:06 AM2/8/13
to jh...@googlegroups.com
Μην μένεις σε αυτό το παράδειγμα, διάβασε το javadoc και πειραματισου. Το java2s συχνά έχει ωραία παραδείγματα


επίσης:

Cheers!

2013/2/8 LiTTle <littl...@gmail.com>

--

Evangelos Pappas

unread,
Feb 8, 2013, 7:31:33 AM2/8/13
to jh...@googlegroups.com
1o Συγνώμη για το Σπαμ
2o Συγνώμη που δεν είδα την τελευταία ερώτηση σου.

η compute θα καλεστεί ούτως ή άλλος, οταν την ξανακάνεις εσύ απλα θα λάβεις το αποτέλεσμα που εχει ειδι τρέξει και εχει υπολογιστεί (ή θα σου  έρθει ασύγχρονα).
Καλώντας 2 join() και καμια compute() θα έχεις εξτα παραλληλισμό που ισως να μην τον χρειάζεσαι
Καλώντας 2 compute() και καμιά join() χανεις παραλληλισμό (κυρίως την μαγεία του ασύγχρονου return χάνεις) που ίσως να το χρειάζεσαι.

Λειτουργείς ανα περίπτωση δηλαδή.

Cheers!

2013/2/8 Evangelos Pappas <papas.e...@gmail.com>
Reply all
Reply to author
Forward
0 new messages