Πώς να εφαρμόσετε Callable Interface σε Java



Αυτό το άρθρο θα σας παράσχει αναλυτικές και περιεκτικές γνώσεις σχετικά με τον τρόπο εφαρμογής του Callable Interface στην Java με παραδείγματα.

Τα προγράμματα πολλαπλών νημάτων Java παρακολουθούν τη χρήση εκτεταμένων Callable και Future. Σύμφωνα με τις προαπαιτούμενες γνώσεις των νημάτων και των πολλαπλών νημάτων, οι αναγνώστες θα είναι σε θέση να κατανοήσουν καλύτερα τη συζήτηση σε αυτό το άρθρο. Όπως θα εξηγήσω το Callable Interface σε Java σε αυτό το άρθρο.

Ανακεφαλαιώστε τα νήματα

Ωστόσο, επιτρέψτε μου να δώσω μια σύντομη εισαγωγή στην έννοια των νημάτων. Ένα νήμα είναι μια ξεχωριστή διαδρομή εκτέλεσης, σε περίπτωση που πρέπει να εκτελέσετε μια επαναλαμβανόμενη εργασία, η εργασία μπορεί να χωριστεί σε πολλές εργασίες και να τις αναθέσετε σε νήματα. Πολλαπλών σπειρωμάτωνδεν είναι τίποτα άλλο παρά την εκχώρηση πολλαπλών νημάτων για την εκτέλεση διαφορετικών εργασιών παράλληλα για γρήγορη λήψη του αποτελέσματος.





ms sql φροντιστήρια για αρχάριους

Τι είναι το Callable Interface στην Java

Για το Java 5, παρουσιάστηκε η τάξη 'java.util.concurrent'. Αυτή η διεπαφή με δυνατότητα κλήσης εισήχθη μέσω του πακέτου ταυτόχρονης εμφάνισης που μοιάζει με τη διεπαφή Runnable. Μπορεί επίσης να επιστρέψει οποιοδήποτε αντικείμενο και μπορεί να ρίξει μια εξαίρεση. Μια διασύνδεση Java Callable χρησιμοποιεί Generics, καθιστώντας έτσι δυνατή την επιστροφή κάθε είδους αντικειμένου. Το Executor Framework δίνει μια μέθοδο υποβολής () για την εκτέλεση υλοποιήσιμων κλήσεων σε ένα σύνολο νημάτων. Στην πραγματικότητα, το Java Executor Framework προσκολλάται στα μοτίβα WorkerThread.

java-interfaceΣε ένα νήμα, οι χρήστες μπορούν να ξεκινήσουν νήματα χρησιμοποιώντας τη μέθοδο Executors.newFixedThreadPool (10) και, κατά συνέπεια, να υποβάλουν μια εργασία σε αυτήν. Ένα runnable ενεργεί ως στόχος ενός νήματος και μια δημόσια εκτέλεση void run () εφαρμόζεται υποχρεωτικά για τον καθορισμό της εργασίας. Αυτό θα εκτελεστεί από νήματα στην ομάδα νημάτων. Με βάση τη διαθεσιμότητα των νημάτων στην ομάδα, το πλαίσιο εκτέλεσης εκχωρεί εργασίες (στόχος με δυνατότητα εκτέλεσης) σε θέματα.Εάν χρησιμοποιούνται όλα τα νήματα, η εργασία πρέπει να σταματήσει. Αφού το νήμα ολοκληρώσει μια εργασία, τότε επιστρέφει στην ομάδα ως διαθέσιμο νήμα, το οποίο είναι έτοιμο να δεχτεί μελλοντικές εργασίες. Το Callable είναι παρόμοιο με το Runnable και μπορεί να επιστρέψει οποιονδήποτε τύπο αντικειμένου όταν θέλουμε να έχουμε ένα αποτέλεσμα ή κατάσταση από την εργασία.



Επιστροφή διασύνδεσης με δυνατότητα κλήσης

Το Java Callable επιστρέφει java.util.concurrent. Το Java Future προσφέρει μια μέθοδο ακύρωσης () για την εξάλειψη της σχετικής εργασίας με δυνατότητα κλήσης. Αυτή είναι μια υπερφορτωμένη έκδοση της μεθόδου get (), όπου μπορεί κανείς να καθορίσει μια συγκεκριμένη ώρα για να περιμένει το αποτέλεσμα. Είναι χρήσιμο να αποφύγετε ένα τρέχον νήμα, το οποίο μπορεί να μπλοκαριστεί για μεγαλύτερο χρονικό διάστημα. Θυμηθείτε ότι η μέθοδος get είναι μια σύγχρονη μέθοδος και έως ότου η κλήση ολοκληρώσει την εργασία της και επιστρέψει μια τιμή, θα πρέπει να περιμένει μια κλήση.

Υπάρχουν επίσης μέθοδοι 'isDone ()' και 'isCancelled ()' για τη λήψη της τρέχουσας κατάστασης μιας σχετικής εργασίας με δυνατότητα κλήσης. Εξετάστε το παράδειγμα όπου πρέπει να βρεθεί ένα άθροισμα όλων των αριθμών από ένα έως 100. Μπορούμε να βρούμε διαδοχικά 1 έως 100 και προσθέτοντάς τα τελικά. Μια άλλη πιθανότητα είναι διαιρώντας και κατακτώντας. Σε αυτήν τη μέθοδο, μπορούμε να ομαδοποιήσουμε τους αριθμούς με τέτοιο τρόπο ώστε κάθε ομάδα να έχει ακριβώς δύο στοιχεία. Τέλος, μπορούμε να αντιστοιχίσουμε αυτήν την ομάδα σε ένα σύνολο νημάτων. Επομένως, κάθε νήμα επιστρέφει ένα μερικό άθροισμα παράλληλα και στη συνέχεια συλλέγει αυτά τα μερικά ποσά και τα προσθέτει για να πάρει ολόκληρο το άθροισμα.



Χαρακτηριστικά του Callable και Future Class

  • Το Callable class είναι μια διεπαφή τύπου SAM και ως εκ τούτου μπορεί να εφαρμοστεί στην έκφραση lambda.

  • Η κλάση με δυνατότητα κλήσης έχει μόνο μία μέθοδο 'κλήση ()' που περιέχει όλους τους κωδικούς που απαιτούνται για την ασύγχρονη εκτέλεση.

  • Σε περιβάλλον με δυνατότητα εκτέλεσης διεπαφής, δεν υπήρχε πιθανότητα επιστροφής του αποτελέσματος του υπολογισμού ή εξαίρεση ελεγχόμενης ρίψης. Ενώ με Callable επιστρέφει μια τιμή και ρίχνει μια επιλεγμένη εξαίρεση είναι διαθέσιμη.

  • Η μέθοδος Get () της κλάσης Future μπορεί να χρησιμοποιηθεί για την ανάκτηση αποτελεσμάτων μόλις ολοκληρωθεί ο υπολογισμός. Οι χρήστες μπορούν επίσης να ελέγξουν εάν ο υπολογισμός έχει ολοκληρωθεί ή όχι χρησιμοποιώντας τη μέθοδο ολοκληρωμένου ().

  • Η ακύρωση του υπολογισμού χρησιμοποιώντας τη μέθοδο future.cancel () είναι επίσης πλεονέκτημα σε ορισμένες εφαρμογές.

  • Το Get () ονομάζεται κλήση αποκλεισμού και συνεχίζει να αποκλείεται έως ότου ολοκληρωθεί ο υπολογισμός.

Σύγκριση κατηγοριών με δυνατότητα κλήσης και εκτέλεσης

Καλείται Τρέξιμο
Είναι μέρος του « java.util.concurrent ' πακέτο από το Java 1.5Είναι μέρος του πακέτου java.lang από το Java 1.0
Μια παραμετροποιημένη διεπαφή, όπως CallableΜια μη παραμετροποιημένη διεπαφή
Ικανότητα να ρίξει μια ελεγμένη ΕξαίρεσηΔεν μπορεί να ρίξει μια ελεγμένη εξαίρεση
Περιέχει μια μεμονωμένη μέθοδο, κλήση (), που επιστρέφει τον τύπο V, είναι ίδια με την καθορισμένη παράμετρο διασύνδεσης «Τύπος»Εδώ, περιέχει μια μεμονωμένη μέθοδο, που ονομάζεται run (), η οποία επιστρέφει άκυρη

Παρακάτω είναι ένα απλό παράδειγμα μιας κλάσης κλήσης Java που εφαρμόζεται όπου ο κώδικας επιστρέφει το όνομα του συγκεκριμένου νήματος, το οποίο εκτελεί την εργασία μετά από ένα δευτερόλεπτο. Εδώ χρησιμοποιούμε το πλαίσιο εξαγωγής για την εκτέλεση 100 εργασιών παράλληλα με το Java Future ως αποτέλεσμα των υποβληθέντων εργασιών. Το πρώτο απόσπασμα είναι η έξοδος και το παρακάτω αντιπροσωπεύει τον κωδικό.

πακέτο com.journaldev.threads εισαγωγή java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java .util.concurrent.Executors εισαγωγή java.util.concurrent.Future δημόσια τάξη Το MyCallable υλοποιεί Callable {@Override public String call () ρίχνει την εξαίρεση {Thread.sleep (1000) // επιστρέψτε το όνομα του νήματος εκτελώντας αυτήν την επιστρέψιμη εργασία επιστροφή Thread.currentThread () .getName ()} public static void main (String args []) {// Λήψη ExecutorService από την κατηγορία βοηθητικών προγραμμάτων Executors, το μέγεθος του νήματος είναι 10 ExecutorService executor = Executors.newFixedThreadPool (10) // δημιουργήστε μια λίστα για να κρατήσετε το μέλλον αντικείμενο που σχετίζεται με τη λίστα με δυνατότητα κλήσηςlist = νέο ArrayList() // Δημιουργία παρουσίας MyCallable Callable = new MyCallable () για (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

Τερματισμός Υπηρεσιών Εκτελεστή

Η κρίσιμη και σημαντική πτυχή που λείπουν πολλοί προγραμματιστές είναι το κλείσιμο του ExecutorService. Το ExecutorService είναι ζωτικής σημασίας και δημιουργείται με επιπλέον στοιχεία νήματος. Λάβετε υπόψη ότι το JVM σταματά μόνο όταν σταματούν όλα τα νήματα που δεν είναι δαίμονας. Έτσι, απλώς ο τερματισμός της υπηρεσίας εκτέλεσης εμποδίζει τη διακοπή λειτουργίας του JVM.

Για να πούμε στην υπηρεσία εκτέλεσης ότι δεν χρειάζεται να εκτελεστούν τα νήματα, πρέπει να κλείσουμε την υπηρεσία.

Υπάρχουν τρεις τρόποι επίκλησης του τερματισμού λειτουργίας:

  • άκυρο κλείσιμο () - Αυτό ξεκινά μια ομαλή απενεργοποίηση στην οποία εκτελούνται εργασίες που έχουν ήδη υποβληθεί, αλλά δεν γίνονται δεκτές νέες εργασίες.
  • Τερματισμός λίστας Τώρα () - Προσπαθεί να σταματήσει όλες τις εργασίες που εκτελούν ενεργά, σταματά την επεξεργασία των εκκρεμών εργασιών και επιστρέφει επίσης μια λίστα με τις εργασίες που περίμεναν την εκτέλεση.
  • άκυρη αναμονή Τερματισμός () - Αυτό συνεχίζει να μπλοκάρει έως ότου ολοκληρωθούν όλες οι εργασίες μετά από ένα αίτημα τερματισμού λειτουργίας ή το χρονικό όριο. Επίσης μπλοκάρει όταν διακόπτεται το τρέχον νήμα. Όλα εξαρτώνται από την πρώτη εργασία.

Με αυτό, φτάνουμε στο τέλος του Callable Interface σε Java άρθρο. Ελπίζω να έχετε μια κατανόηση της μελλοντικής και της κλήσης διασύνδεσης στην Java.

Δείτε το από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για μαθητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου 'Callable Interface in Java' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.