Sådan implementeres Callable Interface i Java



Denne artikel giver dig en detaljeret og omfattende viden om, hvordan du implementerer Callable Interface i Java med eksempler.

Java multithreading-programmer er vidne til brugen af ​​omfattende Kan kaldes og fremtid. Under den forudsatte viden om tråde og multi-threading vil læsere være bedre i stand til at forstå diskussionen i denne artikel. Som jeg vil forklare Callable Interface i Java i denne artikel.

Resumé på tråde

Men lad mig bare give en kort introduktion til begrebet tråde. En tråd er en separat udførelsesvej, hvis du har brug for at udføre en gentagende opgave, kan arbejdet opdeles i flere opgaver og tildele dem til tråde. Multitrådninger intet andet end at tildele flere tråde til at udføre forskellige opgaver parallelt for at få resultatet hurtigt.





Hvad er Callable Interface i Java

For Java 5 blev klassen “java.util.concurrent” introduceret. Denne opkaldbare grænseflade blev bragt ind via den samtidige pakke, der lignede den Runnable-grænseflade. Det kan også returnere ethvert objekt og er i stand til at kaste en undtagelse. En Java Callable-grænseflade bruger Generics, hvilket gør det muligt at returnere enhver form for objekt. Executor Framework giver en submit () metode til at udføre Callable implementeringer i en pool af tråde. I virkeligheden overholder Java Executor Framework WorkerThread-mønstrene.

java-interfaceI en trådpulje kan brugerne starte tråde ved hjælp af metoden Executors.newFixedThreadPool (10) og derfor sende en opgave til den. En kørbar fungerer som mål for en tråd, og en offentlig ugyldig run () -metode er obligatorisk implementeret for at definere opgaven. Dette udføres af tråde i trådpuljen. Baseret på tilgængeligheden af ​​tråde i puljen tildeler Executor Framework arbejde (kørbart mål) til tråde.Hvis alle tråde er i brug, skal opgaven stoppes. Når tråden gennemfører en opgave, vender den tilbage til puljen som en tilgængelig tråd, som er klar til at acceptere fremtidige opgaver. Callable svarer til Runnable og kan returnere enhver type objekt, når vi ønsker at få et resultat eller status fra opgaven.



Returnering af opkaldeligt interface

Java Callable returnerer java.util.concurrent. Java Future tilbyder en annulleringsmetode () til at fjerne den tilknyttede Callable-opgave. Dette er en overbelastet version af get () -metoden, hvor man kan angive et bestemt tidspunkt at vente på resultatet. Det er nyttigt at undgå en aktuel tråd, som kan blive blokeret i længere tid. Husk, at get-metoden er en synkron metode, og indtil den opkaldbare afslutter sin opgave og returnerer en værdi, bliver den nødt til at vente på en kaldbar.

Der er også 'isDone ()' og 'isCancelled ()' -metoder til at hente den aktuelle status for en tilknyttet Callable-opgave. Overvej eksemplet, hvor en sum af alle tal fra et til 100 skal findes. Vi kan sløjfe 1 til 100 sekventielt og tilføje dem endelig. En anden mulighed er ved at dele og erobre. I denne metode kan vi gruppere tallene på en sådan måde, at hver gruppe har nøjagtigt to elementer. Endelig kan vi tildele denne gruppe til en pulje af tråde. Derfor returnerer hver tråd en delvis sum parallelt og indsamler derefter de delvise summer og tilføjer dem for at få hele summen.



Funktioner i Callable og Future Class

  • Callable-klasse er en SAM-grænseflade og kan derfor implementeres i lambda-udtrykket.

  • Den kaldbare klasse har kun en metode 'call ()', der indeholder al den kode, der er nødvendig for at udføre asynkront.

  • I et miljø, der kan køres, var der ingen mulighed for at returnere resultatet af beregningen eller kaste kontrolleret undtagelse. Mens der med Callable kan returneres en værdi og kaste en kontrolleret undtagelse er tilgængelig.

  • Get () -metoden i Future-klassen kan bruges til at hente resultater, når beregningen er udført. Brugere kan også kontrollere, om beregningen er færdig eller ikke ved hjælp af udført () -metoden.

  • Annullering af beregningen ved hjælp af future.cancel () -metoden er også en velsignelse i nogle applikationer.

  • Get () kaldes et blokerende opkald, og det fortsætter med at blokere, indtil beregningen er afsluttet.

Sammenligning af kaldbare og kørbare klasser

Kan kaldes Kan køres
Det er en del af ” java.util.concurrent ' pakke siden Java 1.5Det er en del af java.lang-pakken siden Java 1.0
En parametreret grænseflade, f.eks. KaldbarEn ikke-parametreret grænseflade
I stand til at kaste en kontrolleret undtagelseDet kan ikke kaste en kontrolleret undtagelse
Den indeholder en enkelt metode, kald (), der returnerer Type V, dette er det samme som den definerede interface parameter 'Type'Her indeholder den en enkelt metode, kaldet run (), der returnerer ugyldig

Nedenfor er et simpelt eksempel på en Java-kaldbar klasse implementeret, hvor koden returnerer navnet på den specifikke tråd, som udfører opgaven efter et sekund. Her bruger vi extractor-rammen til at udføre 100 opgaver parallelt med Java Future til resultatet af de indsendte opgaver. Det første uddrag er output, og nedenunder repræsenterer koden.

pakke 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.ExallorService import java .util.concurrent.Executors importerer java.util.concurrent.Future public class MyCallable implementerer Callable {@Override public String call () kaster Undtagelse {Thread.sleep (1000) // returnerer trådnavnet, der udfører denne callable task return Thread.currentThread () .getName ()} public static void main (String args []) {// Get ExecutorService from Executors utility class, thread pool size is 10 ExecutorService executor = Executors.newFixedThreadPool (10) // Opret en liste til at holde fremtiden objekt, der er knyttet til den kaldbare listeliste = ny ArrayList() // Opret MyCallable-forekomst Callable callable = new MyCallable () for (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() } } 

hvordan man installerer php på windows

Lukning af eksekutortjenester

Det afgørende og vigtige aspekt, som mange udviklere savner, er at lukke ExecutorService. ExecutorService er vital og er oprettet med yderligere trådelementer. Husk, at JVM kun stopper, når alle ikke-dæmontråde stoppes. Således forhindrer simpelthen lukning af eksekutortjenesten, at JVM stopper.

For at fortælle eksekutortjenesten, at der ikke er behov for, at tråde køres, skal vi lukke tjenesten.

Der er tre måder at påberåbe nedlukning på:

  • ugyldig nedlukning () - Dette indleder en ordnet nedlukning, hvor tidligere indsendte opgaver udføres, men ingen nye opgaver accepteres.
  • Liste nedlukning nu () - Det forsøger at stoppe al aktiv udførelse af opgaver, standser behandlingen af ​​ventende opgaver og returnerer også en liste over de opgaver, der ventede på udførelse.
  • ugyldigt afventerTermination () - Dette fortsætter med at blokere, indtil alle opgaver er færdig med udførelsen efter en nedlukningsanmodning, eller timeout opstår. Det blokerer også, når den aktuelle tråd afbrydes. Alt afhænger af, hvilken opgave der kommer først.

Med dette kommer vi til slutningen af ​​Callable Interface i Java-artiklen. Jeg håber, du har forståelse for Future og Callable Interface i Java.

Tjek den af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til studerende og fagfolk, der ønsker at være Java-udvikler.

Har du et spørgsmål til os? Nævn det i kommentarfeltet på denne 'Callable Interface in Java' -blog, og vi vender tilbage til dig hurtigst muligt.