Τι είναι το ExecutorService στην Java και πώς να το δημιουργήσετε;

Αυτό το άρθρο καλύπτει την έννοια του Executor sub-interface ExecutorService in Java με διάφορα παραδείγματα για να εξηγήσει τη δημιουργία και διαχείριση νήματος στην Java.

Η γλώσσα προγραμματισμού Java λειτουργεί πολύ αποτελεσματικά εφαρμογές που απαιτούν την εκτέλεση των εργασιών ταυτόχρονα σε ένα νήμα. Γίνεται δύσκολο για οποιαδήποτε εφαρμογή να εκτελεί ταυτόχρονα μεγάλο αριθμό νημάτων. Για να ξεπεραστεί αυτό το πρόβλημα, έρχεται με ExecutorService που είναι μια υπο-διεπαφή του . Σε αυτό το άρθρο, θα συζητήσουμε τη λειτουργικότητα του ExecutorService στην Java. Ακολουθούν τα θέματα που καλύπτονται σε αυτό το ιστολόγιο:



Τι είναι το Executor Framework;

Είναι αρκετά πιο εύκολο να φτιάξετε και να εκτελέσετε ένα ή δύο νήματα ταυτόχρονα. Αλλά γίνεται δύσκολο όταν ο αριθμός των νημάτων αυξάνεται σε σημαντικό αριθμό. Μεγάλες εφαρμογές πολλαπλών νημάτων θα έχουν εκατοντάδες νήματα να λειτουργούν ταυτόχρονα. Επομένως, είναι απολύτως λογικό ο διαχωρισμός της δημιουργίας νήματος από τη διαχείριση νημάτων σε μια εφαρμογή.



Ο εκτελεστής είναι α σας βοηθά στη δημιουργία και διαχείριση νημάτων σε μια εφαρμογή. ο σας βοηθά στις ακόλουθες εργασίες.

  • Δημιουργία νήματος: Παρέχει μια ποικιλία μεθόδων για τη δημιουργία νημάτων που βοηθούν στην ταυτόχρονη εκτέλεση των εφαρμογών σας.



  • Διαχείριση νημάτων: Διαχειρίζεται επίσης τον κύκλο ζωής του νήματος. Δεν χρειάζεται να ανησυχείτε εάν το νήμα είναι ενεργό, απασχολημένο ή νεκρό πριν υποβάλλετε την εργασία για εκτέλεση.

  • Υποβολή εργασιών και εκτέλεση: Το πλαίσιο Executor παρέχει μεθόδους για την υποβολή εργασιών στο νήμα, δίνει επίσης τη δυνατότητα να αποφασίζει εάν το νήμα θα εκτελεστεί ή όχι.

εκτελεστική υπηρεσία-εκτελεστική υπηρεσία στο java -edureka

Παράδειγμα ExecutorService σε Java

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



Στο παρακάτω παράδειγμα, θα δημιουργήσουμε μια υπηρεσία ExecutorService με ένα νήμα και στη συνέχεια θα υποβάλουμε την εργασία που θα εκτελεστεί μέσα στο νήμα.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors δημόσια τάξη Παράδειγμα {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( System.out.println ('create ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('create a runnable') Runnable runnable = () -> {System.out.println ('μέσα: '+ Thread.currentThread (). GetName ())} System.out.println (' υποβάλλετε την εργασία που καθορίζεται από το runnable στην εκτελεστική υπηρεσία ') executorservice.submit (runnable)}}
 Παραγωγή: Inside: main create ExecutorService δημιουργία runnable υποβάλετε την εργασία που καθορίζεται από το runnable στην εκτελεστική υπηρεσία μέσα: pool-1-thread-1

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

Όταν εκτελείτε το παραπάνω πρόγραμμα, το πρόγραμμα δεν θα τερματιστεί ποτέ. Θα πρέπει να την απενεργοποιήσετε ρητά, καθώς η υπηρεσία εκτελεστών συνεχίζει να ακούει για νέες εργασίες.

Εφαρμογές Java ExecutorService

Το ExecutorService μοιάζει πολύ με ένα νήμα. Στην πραγματικότητα, η εφαρμογή του ExecutorService στο java.util.concurrent πακέτο είναι μια εφαρμογή threadpool. Το ExecutorService έχει τις ακόλουθες υλοποιήσεις στο πακέτο java.util.concurrent:

ThreadPoolExecutor

Το ThreadPoolExecutor εκτελεί τις δεδομένες εργασίες χρησιμοποιώντας ένα από τα εσωτερικά συγκεντρωμένα νήματά του.

Δημιουργία threadPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, νέο LinkedBlockingQueue ())

SchedchedThreadPoolExecutor

Το java.util.concurrent.SchedchedThreadPoolExecutor είναι μια υπηρεσία ExecutorService που μπορεί να προγραμματίσει εργασίες που εκτελούνται μετά από καθυστέρηση ή να εκτελούνται επανειλημμένα με ένα σταθερό χρονικό διάστημα μεταξύ κάθε εκτέλεσης.

Παράδειγμα

SchedchedExecutorService schedexexecutorservice = Executors.newSchedchedThreadPool (5) SchedchedFuture schedfuture = schedExecutorService.schedule (new Callable () {public Object call () ρίχνει την Εξαίρεση {System.out.println ('εκτελέστηκε') επιστροφή 'που ονομάζεται'}}}, 5, TimeUnit. ΔΕΥΤΕΡΑ)

Χρήση ExecutorService

Υπάρχουν μερικοί διαφορετικοί τρόποι για την ανάθεση καθηκόντων σε ένα ExecutorService.

  • εκτέλεση (Runnable)

  • υποβολή (με δυνατότητα εκτέλεσης)

  • επίκληση Οποιοδήποτε ()

  • επίκλησηΌλα ()

Εκτελέστε το Runnable

Το Java ExecutorService execute (Runnable) παίρνει ένα αντικείμενο java.lang.Runnable και το εκτελεί ασύγχρονα.

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (new Runnable () {public void run () {System.out.println ('asynchronous task')}}) εκτελεστήςService.shutdown ()

Δεν υπάρχει τρόπος να λάβετε το αποτέλεσμα του εκτελέσιμου Runnable, για αυτό πρέπει να χρησιμοποιήσετε το Callable.

Υποβολή με δυνατότητα εκτέλεσης

Η μέθοδος Java ExecutorService submission (Runnable) λαμβάνει μια εκτέλεση Runnable και επιστρέφει ένα μελλοντικό αντικείμενο. Το μελλοντικό αντικείμενο μπορεί να χρησιμοποιηθεί για να ελέγξει αν το Runnable έχει ολοκληρωθεί.

Future μέλλον = executorService.submit (new Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // επιστρέφει null εάν η εργασία ολοκληρωθεί σωστά.

Υποβολή με δυνατότητα κλήσης

Η μέθοδος Java ExecutorService submission (Callable) είναι παρόμοια με την υποβολή (Runnable), αλλά χρειάζεται Java Callable αντί για Runnable.

Future μέλλον = executorService.submit (new Callable () {public Object call () ρίχνει την Εξαίρεση {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 Παραγωγή: Asynchroous callable future.get = Αποτέλεσμα με δυνατότητα κλήσης

επίκληση Οποιοδήποτε ()

Η μέθοδος invokeAny () λαμβάνει μια συλλογή αντικειμένων με δυνατότητα κλήσης. Η επίκληση αυτής της μεθόδου δεν επιστρέφει κανένα μέλλον, αλλά επιστρέφει το αποτέλεσμα ενός από τα Callable αντικείμενα.

ExecutorService executorService = Σετ Executors.newSingleThreadExecutor ()callables = νέο HashSet() callables.add (new Callable () {public String call () ρίχνει την εξαίρεση {return'task A '}}) callables.add (new Callable () {public String call () ρίχνει την εξαίρεση {return'task B'} }) callables.add (new Callable () {public String call () ρίχνει Εξαίρεση {return'task C '}}) String result = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .ΤΕΡΜΑΤΙΣΜΟΣ ΛΕΙΤΟΥΡΓΙΑΣ()

Όταν εκτελείτε τον παραπάνω κώδικα, το αποτέλεσμα αλλάζει. Μπορεί να είναι Task A, Task B και ούτω καθεξής.

InvokeΌλα ()

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

ExecutorService executorService = Σετ Executors.newSingleThreadExecutor ()callables = νέο HashSet() callables.add (new Callable () {public String call () ρίχνει Exception {return 'Task A'}}) callables.add (new Callable () {public String call () ρίχνει την εξαίρεση {return 'Task B'} }) callables.add (new Callable () {public String call () ρίχνει την εξαίρεση {return 'Task C'}}) Λίσταfutures = executorService.invokeAll (callables) για (Future μέλλον: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

Οι διεπαφές με δυνατότητα εκτέλεσης και κλήσης είναι πολύ παρόμοιες μεταξύ τους. Η διαφορά είναι ορατή στη δήλωση του διεπαφές. Και οι δύο διεπαφές αντιπροσωπεύουν μια εργασία που μπορεί να εκτελεστεί ταυτόχρονα από ένα νήμα ή ExecutorService.

Δήλωση με δυνατότητα κλήσης:

δημόσια διεπαφή με δυνατότητα κλήσης {δημόσιο αντικείμενο () ρίχνει Εξαίρεση}

Δήλωση με δυνατότητα εκτέλεσης:

δημόσια διεπαφή Runnable {public void run ()}

Η κύρια διαφορά μεταξύ των δύο είναι ότι η μέθοδος κλήσης () μπορεί να επιστρέψει ένα αντικείμενο από τη μέθοδο κλήσης. Και η μέθοδος κλήσης () μπορεί να ρίξει ένα ενώ η μέθοδος run () δεν μπορεί.

τι είναι προγραμματιστής ios

ακύρωση εργασίας

Μπορείτε να ακυρώσετε την εργασία που υποβάλατε στο ExecutorService καλώντας απλώς τη μέθοδο ακύρωσης στο μέλλον που υποβλήθηκε κατά την υποβολή της εργασίας.

future.cancel ()

Τερματισμός λειτουργίας του ExecutorService

Για να αποτρέψετε την εκτέλεση των νημάτων ακόμα και μετά την ολοκλήρωση της εκτέλεσης, θα πρέπει να τερματίσετε την υπηρεσία ExecutorService.

ΤΕΡΜΑΤΙΣΜΟΣ ΛΕΙΤΟΥΡΓΙΑΣ()

Για να τερματίσετε τα νήματα μέσα σε μια υπηρεσία ExecutorService μπορείτε να καλέσετε τη μέθοδο τερματισμού ().

εκτελεστήςService.shutdown ()

Αυτό μας φέρνει στο τέλος αυτού του άρθρου όπου μάθαμε πώς μπορούμε να χρησιμοποιήσουμε το ExecutorService για την εκτέλεση εργασιών σε ένα νήμα. Ελπίζω να είστε ξεκάθαροι με όλα όσα έχουν μοιραστεί μαζί σας σε αυτό το σεμινάριο.

Εάν βρήκατε αυτό το άρθρο σχετικά με το 'ExecutorService in Java', ανατρέξτε στο μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο.

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

Εάν συναντήσετε οποιεσδήποτε ερωτήσεις, μη διστάσετε να κάνετε όλες τις ερωτήσεις σας στην ενότητα σχολίων του 'ExecutorService in Java' και η ομάδα μας θα χαρεί να απαντήσει.