Executor, ExecutorService, Executor - 1

"Hej, Amigo!"

"Ingenting är perfekt när det först skapas. Detsamma gäller trådar. Med tiden blev Javas skapare övertygade om bristerna i Runnable-gränssnittet. Det stödde inte att kasta undantag och gjorde det inte möjligt att ta reda på resultat av att utföra uppgifter..."

"Det Runnable-gränssnittet är mer lämpligt för stora oberoende uppgifter än för små deluppgifter som du vill köra ett dussin åt gången och sedan samla in deras resultat."

"Det är därför Callable- gränssnittet uppfanns. Det är mycket bättre lämpat för parallellkörning av små uppgifter än Runnable och Thread, delvis för att det är ett generiskt gränssnitt."

"Här är en typisk implementering av gränssnittet:"

Exempel
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();
 }
}

"Till skillnad från Runnable måste vi här åsidosätta anropsmetoden, som returnerar ett resultat av den typ som anges av typen argument. Detta tillvägagångssätt är mycket bekvämare än Runnable-gränssnittets körmetod, som returnerar void. Ibland var utvecklare tvungna att hitta på olika lösningar för att få en tråds resultat."

"Jag förstår."

"Och titta nu på hur Callable kan fungera tillsammans med ThreadPoolExecutor:

"Först returnerar ThreadPoolExecutor -klassens submit-metod ett parameteriserat Future-objekt. Du kan använda detta objekt för att ta reda på om en uppgift är klar och för att få resultatet."

"Så här fungerar det:"

Exempel
// 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();

"Långt borta! Jag gillar särskilt Future-klassen. Vilka metoder har den?"

"Här är de mest intressanta:"

Metod Beskrivning
boolean cancel(boolean mayInterrupt);
Stoppar uppgiften.
boolean isCancelled();
Returnerar sant om uppgiften stoppades.
boolean isDone();
Returnerar sant om uppgiften är klar och exekveras.
V get() throws InterruptedException, ExecutionException;
Returnerar resultatet av anropsmetoden eller kastar ett undantag om ett sådant inträffade.

"Coolt! Så du kan också stoppa uppgifter."

"Lita inte för mycket på det här – inte alla trådar kan stoppas. Men om en uppgift fortfarande finns i kön kommer det att fungera bra."

"Jag gillar det här tillvägagångssättet. Det är mycket bekvämare än att skapa trådar själv och sedan försöka dra ut ett resultat ur dem."

"Jättebra. Det är där vi slutar idag."