Utfører, EksekutorService, Utfører - 1

"Hei, Amigo!"

"Ingenting er perfekt når det først opprettes. Det samme gjelder tråder. Med tiden ble Javas skapere overbevist om manglene ved Runnable-grensesnittet. Det støttet ikke å kaste unntak og gjorde det ikke mulig å finne ut resultat av å utføre oppgaver ..."

"Runnable-grensesnittet er mer egnet for store uavhengige oppgaver enn for små underoppgaver som du vil kjøre et dusin om gangen, og deretter samle inn resultatene."

"Det er derfor Callable- grensesnittet ble oppfunnet. Det er mye bedre egnet for parallell utførelse av små oppgaver enn Runnable og Thread, delvis fordi det er et generisk grensesnitt."

"Her er en typisk implementering av grensesnittet:"

Eksempel
class ReverseString implements Callable<String>
{
 String str;

 ReverseString(String str)
 {
  this.str = str;
 }

 public String call() throws Exception
 {
  StringBuilder builder = new StringBuilder(str);
  builder.reverse();
  return builder.toString();
 }
}

"I motsetning til Runnable , må vi her overstyre call-metoden, som returnerer et resultat av typen spesifisert av type-argumentet. Denne tilnærmingen er mye mer praktisk enn Runnable-grensesnittets kjøremetode, som returnerer void. Noen ganger måtte utviklere komme med ulike løsninger for å få resultatet til en tråd."

"Jeg skjønner."

"Og se nå på hvordan Callable kan fungere sammen med ThreadPoolExecutor:

"For det første returnerer ThreadPoolExecutor -klassens innsendingsmetode et parameterisert Future-objekt. Du kan bruke dette objektet til å finne ut om en oppgave er fullført og for å få resultatet."

"Slik fungerer det:"

Eksempel
// 1. Create a ThreadPoolExecutor
ExecutorService service = Executors.newFixedThreadPool(5);

// 2. Add a task to it
Future<String> task = service.submit(new ReverseString("Amigo"));

// 3. Wait until the task is done
while(!task.isDone())
{
 Thread.sleep(1);
}

// 4. Try to get the result
//We will get either the result, or an exception if one occurred while the task was being executed
try
{
 System.out.println("Full string : " + task.get());
}
catch (Exception ie)
{
 ie.printStackTrace(System.err);
}
  
// 5. Stop the ThreadPool.
service.shutdown();

"Langt ute! Jeg liker spesielt Future-klassen. Hvilke metoder har den?"

"Her er de mest interessante:"

Metode Beskrivelse
boolean cancel(boolean mayInterrupt);
Stopper oppgaven.
boolean isCancelled();
Returnerer sann hvis oppgaven ble stoppet.
boolean isDone();
Returnerer sann hvis oppgaven utføres under utførelse.
V get() throws InterruptedException, ExecutionException;
Returnerer resultatet av anropsmetoden eller kaster et unntak hvis det skjedde.

"Kult! Så du kan også stoppe oppgaver."

"Ikke stol for mye på dette – ikke alle tråder kan stoppe. Men hvis en oppgave fortsatt er i køen, vil dette fungere fint."

"Jeg liker denne tilnærmingen. Det er mye mer praktisk enn å lage tråder selv og deretter prøve å trekke et resultat ut av dem."

"Flott. Det er der vi avslutter i dag."