Όπως έγραφα και στην προηγούμενη ανάρτηση ένα δεύτερο σημαντικό θέμα στην διαχείριση των Threads είναι η αποφυγή δημιουργίας απεριόριστων java.util.Timer, γιατι κάθε Timer εμπεριέχει κι απο ένα TimerThread. Οπότε αντιστοιχα έχουμε ένα Thread για κάθε Timer. Όμως υπάρχει επίσης αλλο ένα πρόβλημα με το java.util.Timer, καθε instance μπορεί να εκτελει "ταυτοχρονα" μονο ένα TimerTask. Οπότε αν του αναθέσουμε δυο TimerTask που πρέπει να ξεκινήσουνε μαζι, θα εκτελεστει το ένα και το αλλο θα θεωρηθεί εκπρόθεσμο.
Την λύση στο πρόβλημα του Timer το λύνει ένα ειδικού τύπου ThreadPoolExecutor, το ScheduledThreadPoolExecutor. Όπου το δημιουργούμε οριζοντας το πόσα Threads θα δημιουργηθούν στο Thread Pool, δηλαδη πόσες ταυτόχρονες εργασίες [Tasks] θέλουμε να γίνονται, ενώ αν ταυτοχρονα έχουν προγραμματιστει περισσότερες, αλλά δε υπάρχουν διαθέσιμα Threads τοτε απλά θα εκτελεστουν στη σειρα.
Παραδειγμα μπορείτε να βρειτε εδώ.
Ολο και κάτι έχω πάντα να πω και να γράψω για αυτά που συμβαίνουν στην πραγματική μου ζωή ή στο μυαλό μου.. I always find something to share with you..
Εμφάνιση αναρτήσεων με ετικέτα Concurrency. Εμφάνιση όλων των αναρτήσεων
Εμφάνιση αναρτήσεων με ετικέτα Concurrency. Εμφάνιση όλων των αναρτήσεων
Κυριακή 6 Απριλίου 2008
Σάββατο 5 Απριλίου 2008
Java Concurrency in Practice
Τις τελευταίες δυο βδομάδες έχει προκύψει στην δουλεια η ανάγκη για χρήση πολλαπλών Thread αναζήτησης για να εξυπηρετούν ένα Thread [request] καθε client. Δηλαδή έχει ζητηθει ο πελάτης να ζητάει, για παραδειγμα, ξενοδοχείο στην Αθήνα για δυο νύχτες την 21η Μαϊου 2008 κι αυτό θα πρέπει απο το πρόγραμμα να σπάει σε αναζήτηση ξενοδοχείων σε διάφορα εξωτερικά συστήματα. Αλλά προκειμένου να μειώσουμε τον χρόνο που θα χρειαστεί για να εξυπηρετήσει τον τελικό πελάτη, αποφασίσαμε να ανοίγουμε πολλαπλά Threads που παράλληλα θα αναζητούν ξενοδοχεία στα διάφορα εξωτερικά συστηματα.
Αλλά όπως είναι γνωστό, αλλα και λογικο, δεν είναι σωστό να ανοίγεις ανεξέλεκτα Threads. Γιατι αυτά μεταφράζονται σε Threads που ανοίγονται στο λειτουργικό σύστημα, όπου υπάρχει ένας περιορισμός. Οπότε αποφασίσαμε να οδηγηθούμε σε μια πιο σωστή λύση, που ειναι το να περιορίσουμε το μέγιστο πλήθος Thread, δηλαδή να χρησιμοποιήσουμε ThreadPooling. Κατι που φανταζει δύσκολο και περιπλοκο αλλά στην πραγματικότητα ειναι πανεύκολο! Πολύ απλά πρέπει να υλοποιήσεις ένα Interface που ονομάζεται Callable και το οποιο ειναι κάτι πιο προχωρημένο απο το απλό Runable, καθώς επιστρέφει αποτέλεσμα! Οπότε αν έχεις κάποια διαδικασία που πρόκειται να επιστρέψει αποτέλεσμα μπορείς πολύ εύκολα να υλοποιήσεις την Callable που θα γυρνάει στο τέλος αυτό το αποτέλεσμα!
Κατεβάστε τον κώδικα-παράδειγμα εδώ
ΥΓ: Σύντομα θα γραψω και για άλλο ένα γνωστό, παρομοιο, πρόβλημα που υπάρχει όταν χρησιμοποιείται το java.util.Timer
Αλλά όπως είναι γνωστό, αλλα και λογικο, δεν είναι σωστό να ανοίγεις ανεξέλεκτα Threads. Γιατι αυτά μεταφράζονται σε Threads που ανοίγονται στο λειτουργικό σύστημα, όπου υπάρχει ένας περιορισμός. Οπότε αποφασίσαμε να οδηγηθούμε σε μια πιο σωστή λύση, που ειναι το να περιορίσουμε το μέγιστο πλήθος Thread, δηλαδή να χρησιμοποιήσουμε ThreadPooling. Κατι που φανταζει δύσκολο και περιπλοκο αλλά στην πραγματικότητα ειναι πανεύκολο! Πολύ απλά πρέπει να υλοποιήσεις ένα Interface που ονομάζεται Callable και το οποιο ειναι κάτι πιο προχωρημένο απο το απλό Runable, καθώς επιστρέφει αποτέλεσμα! Οπότε αν έχεις κάποια διαδικασία που πρόκειται να επιστρέψει αποτέλεσμα μπορείς πολύ εύκολα να υλοποιήσεις την Callable που θα γυρνάει στο τέλος αυτό το αποτέλεσμα!
Κατεβάστε τον κώδικα-παράδειγμα εδώ
ΥΓ: Σύντομα θα γραψω και για άλλο ένα γνωστό, παρομοιο, πρόβλημα που υπάρχει όταν χρησιμοποιείται το java.util.Timer
Εγγραφή σε:
Αναρτήσεις (Atom)