So implementieren Sie eine aufrufbare Schnittstelle in Java



In diesem Artikel erhalten Sie anhand von Beispielen detaillierte und umfassende Kenntnisse zur Implementierung der Callable Interface in Java.

In Java-Multithreading-Programmen werden umfangreiche Programme verwendet Callable und Zukunft. Unter den erforderlichen Kenntnissen über Threads und Multithreading können die Leser die Diskussion in diesem Artikel besser erfassen. Wie ich in diesem Artikel die Callable Interface in Java erläutern werde.

Fassen Sie die Themen zusammen

Lassen Sie mich jedoch nur eine kurze Einführung in das Konzept der Threads geben. Ein Thread ist ein separater Ausführungspfad. Wenn Sie eine sich wiederholende Aufgabe ausführen müssen, kann die Arbeit in mehrere Aufgaben unterteilt und diesen Threads zugewiesen werden. Multithreadingist nichts anderes als das Zuweisen mehrerer Threads, um verschiedene Aufgaben parallel auszuführen und das Ergebnis schnell zu erhalten.





Was ist Callable Interface in Java?

Für Java 5 wurde die Klasse 'java.util.concurrent' eingeführt. Diese aufrufbare Schnittstelle wurde über das Parallelitätspaket eingeführt, das der Runnable-Schnittstelle ähnelte. Es kann auch jedes Objekt zurückgeben und eine Ausnahme auslösen. Eine Java Callable-Schnittstelle verwendet Generics, sodass jeder Objekttyp zurückgegeben werden kann. Das Executor Framework bietet eine submit () -Methode zum Ausführen von Callable-Implementierungen in einem Thread-Pool. In Wirklichkeit haftet das Java Executor Framework an den WorkerThread-Mustern.

java-interfaceIn einem Thread-Pool können Benutzer Threads mithilfe der Executors.newFixedThreadPool (10) -Methode initiieren und dementsprechend eine Aufgabe an sie senden. Eine ausführbare Datei fungiert als Ziel eines Threads, und eine öffentliche void run () -Methode wird zwingend implementiert, um die Aufgabe zu definieren. Dies wird von Threads im Thread-Pool ausgeführt. Basierend auf der Verfügbarkeit der Threads im Pool weist das Executor Framework Threads Arbeit (ausführbares Ziel) zu.Wenn alle Threads verwendet werden, muss die Aufgabe blockiert werden. Nachdem der Thread eine Aufgabe abgeschlossen hat, kehrt er als verfügbarer Thread zum Pool zurück, der bereit ist, zukünftige Aufgaben anzunehmen. Callable ähnelt Runnable und kann jeden Objekttyp zurückgeben, wenn wir ein Ergebnis oder einen Status von der Aufgabe erhalten möchten.



Rückgabe der aufrufbaren Schnittstelle

Java Callable gibt java.util.concurrent zurück. Java Future bietet eine cancel () -Methode, um die zugehörige Callable-Task zu entfernen. Dies ist eine überladene Version der Methode get (), bei der eine bestimmte Zeit angegeben werden kann, um auf das Ergebnis zu warten. Es ist nützlich, einen aktuellen Thread zu vermeiden, der möglicherweise für einen längeren Zeitraum blockiert wird. Bitte denken Sie daran, dass die get-Methode eine synchrone Methode ist. Bis der Callable seine Aufgabe beendet und einen Wert zurückgibt, muss er auf einen Callable warten.

Es gibt auch die Methoden 'isDone ()' und 'isCancelled ()', um den aktuellen Status einer zugeordneten aufrufbaren Aufgabe abzurufen. Betrachten Sie das Beispiel, in dem eine Summe aller Zahlen von eins bis 100 gefunden werden muss. Wir können 1 bis 100 nacheinander schleifen und sie schließlich hinzufügen. Eine andere Möglichkeit ist das Teilen und Erobern. Bei dieser Methode können wir die Zahlen so gruppieren, dass jede Gruppe genau zwei Elemente enthält. Schließlich können wir diese Gruppe einem Pool von Threads zuweisen. Daher gibt jeder Thread parallel eine Teilsumme zurück und sammelt dann diese Teilsummen und addiert sie, um die gesamte Summe zu erhalten.

Fibonacci rekursives c ++



Merkmale von Callable und Future Class

  • Die aufrufbare Klasse ist eine Schnittstelle vom Typ SAM und kann daher im Lambda-Ausdruck implementiert werden.

  • Die aufrufbare Klasse verfügt nur über eine Methode 'call ()', die den gesamten Code enthält, der für die asynchrone Ausführung erforderlich ist.

  • In einer ausführbaren Schnittstellenumgebung gab es keine Möglichkeit, das Ergebnis der Berechnung zurückzugeben oder eine geprüfte Ausnahme auszulösen. Während bei Callable die Rückgabe eines Werts und das Auslösen einer aktivierten Ausnahme verfügbar ist.

    Was sind Kontextfilter in Tableau?
  • Die Get () -Methode der Future-Klasse kann verwendet werden, um Ergebnisse abzurufen, sobald die Berechnung abgeschlossen ist. Benutzer können auch mithilfe der Methode done () überprüfen, ob die Berechnung abgeschlossen ist oder nicht.

  • Das Abbrechen der Berechnung mithilfe der future.cancel () -Methode ist in einigen Anwendungen ebenfalls ein Segen.

  • Get () wird als blockierender Aufruf bezeichnet und blockiert weiter, bis die Berechnung abgeschlossen ist.

Vergleich von aufrufbaren und ausführbaren Klassen

Abrufbar Runnable
Es ist Teil des „ java.util.concurrent ' Paket seit Java 1.5Es ist seit Java 1.0 Teil des Pakets java.lang
Eine parametrisierte Schnittstelle wie CallableEine nicht parametrisierte Schnittstelle
Kann eine aktivierte Ausnahme auslösenEs kann keine aktivierte Ausnahme auslösen
Es enthält eine einzige Methode, call (), die Typ V zurückgibt. Dies entspricht dem definierten Schnittstellenparameter 'Type'.Hier enthält es eine einzelne Methode namens run (), die void zurückgibt

Im Folgenden finden Sie ein einfaches Beispiel für eine implementierbare Java-Klasse, bei der der Code den Namen des spezifischen Threads zurückgibt, der die Aufgabe nach einer Sekunde ausführt. Hier verwenden wir das Extraktor-Framework, um 100 Aufgaben parallel zu Java Future zum Ergebnis der übermittelten Aufgaben auszuführen. Das erste Snippet ist die Ausgabe und das folgende repräsentiert den Code.

Paket com.journaldev.threads import 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 import java.util.concurrent.Future öffentliche Klasse MyCallable implementiert Callable {@Override public String call () löst eine Ausnahme aus {Thread.sleep (1000) // gibt den Threadnamen zurück, der diese aufrufbare Task ausführt, und gibt Thread.currentThread zurück () .getName ()} public static void main (String args []) {// ExecutorService von der Executors-Dienstprogrammklasse abrufen, Thread-Pool-Größe beträgt 10 ExecutorService executor = Executors.newFixedThreadPool (10) // Eine Liste für die Zukunft erstellen Objekt, das der aufrufbaren Liste zugeordnet istlist = new ArrayList() // MyCallable-Instanz erstellen Callable callable = new MyCallable () für (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() } } 

Executor Services herunterfahren

Der entscheidende und wichtige Aspekt, den viele Entwickler vermissen, ist das Herunterfahren des ExecutorService. Der ExecutorService ist wichtig und wird mit zusätzlichen Thread-Elementen erstellt. Beachten Sie, dass die JVM nur gestoppt wird, wenn alle Nicht-Daemon-Threads gestoppt sind. Durch einfaches Herunterfahren des Executor-Dienstes wird somit verhindert, dass die JVM gestoppt wird.

Um dem Executor-Service mitzuteilen, dass die Threads nicht ausgeführt werden müssen, sollten wir den Service herunterfahren.

Es gibt drei Möglichkeiten, das Herunterfahren aufzurufen:

Unterschied zwischen Überladen und Überschreiben in Java
  • void shutdown () - Dies initiiert ein ordnungsgemäßes Herunterfahren, bei dem zuvor übermittelte Aufgaben ausgeführt werden, aber keine neuen Aufgaben akzeptiert werden.
  • Liste shutdownNow () - Es wird versucht, alle aktiv ausgeführten Aufgaben zu stoppen, die Verarbeitung ausstehender Aufgaben anzuhalten und eine Liste der Aufgaben zurückzugeben, die auf die Ausführung warteten.
  • void awaitTermination () - Dies wird so lange blockiert, bis alle Aufgaben nach einer Anforderung zum Herunterfahren ausgeführt wurden oder das Timeout auftritt. Es wird auch blockiert, wenn der aktuelle Thread unterbrochen wird. Alles hängt davon ab, welche Aufgabe zuerst kommt.

Damit kommen wir zum Ende der Callable Interface im Java-Artikel. Ich hoffe, Sie haben ein Verständnis für Future and Callable Interface in Java.

Besuche die von Edureka, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Der Java J2EE- und SOA-Schulungs- und Zertifizierungskurs von Edureka richtet sich an Studenten und Fachleute, die Java-Entwickler werden möchten.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses Blogs „Callable Interface in Java“. Wir werden uns so schnell wie möglich bei Ihnen melden.