Testamentsexekutor

Executor är basgränssnittet för klasser som implementerar lanseringen av körbara uppgifter. Detta ger hjälp med att lägga till en uppgift och hur man startar den.

ExecutorService är ett gränssnitt som utökar egenskaperna för Executor och som beskriver en tjänst för att köra körbara eller anropbara uppgifter. Inlämningsmetoderna accepterar en uppgift i form av en Callable eller Runnable som en ingång , och en Future används som ett returvärde, genom vilket du kan få resultatet.

Metoden invokeAll ansvarar för att utföra uppgifter, returnera en lista med uppgifter med deras status och slutföranderesultat.

Metoden invokeAny är ansvarig för att utföra uppgifter, returnera resultatet av en framgångsrikt slutförd uppgift (det vill säga utan att skapa ett undantag), om det finns något.

ScheduledExecutorService - detta gränssnitt lägger till möjligheten att köra väntande uppgifter med en viss fördröjning eller en viss period.

AbstractExecutorService är en abstrakt klass för att konstruera en ExecutorService 'a. Inuti finns en implementering av metoderna submit , invokeAll , invokeAny . Den här klassen ärver ThreadPoolExecutor , ScheduledThreadPoolExecutor och ForkJoinPool .

public static void main(String[] args) {
   ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
   Callable<String> task = () -> {
       System.out.println(Thread.currentThread().getName());
       return Thread.currentThread().getName();
   };
   scheduledExecutorService.schedule(task, 10, TimeUnit.SECONDS);
   scheduledExecutorService.shutdown();
}

ThreadPoolExecutor

Executors är en fabriksklass för att skapa ThreadPoolExecutor , ScheduledThreadPoolExecutor . Om du behöver skapa en av dessa pooler, då är denna fabrik precis vad du behöver. Den innehåller olika adaptrar Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable och andra. Har statiska metoder för att skapa olika ThreadPool .

ThreadPoolExecutor - Implementerar Executor- och ExecutorService- gränssnitten och separerar uppgiftsskapande från aktivitetsexekvering. Vi behöver implementera körbara objekt och skicka dem till executorn, och ThreadPoolExecutor ansvarar för deras exekvering, instansiering och arbete med trådar.

ScheduledThreadPoolExecutor - Förutom ThreadPoolExecutor -metoderna skapar den en pool av trådar som kan schemalägga kommandon att köra efter en viss fördröjning eller för periodisk exekvering.

ThreadFactoryär ett objekt som skapar nya trådar på begäran. Vi måste skicka en instans till metoden Executors.newSingleThreadExecutor(ThreadFactory threadFactory) .

ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
 @Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "MyThread");
thread.setPriority(Thread.MAX_PRIORITY);
 return thread; }
 });

RejectedExecutionHandler - låter dig definiera en hanterare för uppgifter som av någon anledning inte kan köras via ThreadPoolExecutor . Detta händer när det inte finns några gratisströmmar eller tjänsten stängs av eller stängs av.

Flera standardimplementationer finns i klassen ThreadPoolExecutor :

  • CallerRunsPolicy - kör en uppgift på den anropande tråden;
  • AbortPolicy - ger ett undantag;
  • DiscardPolicy - ignorerar uppgiften;
  • DiscardOldestPolicy - Tar bort den äldsta ostartade uppgiften från kön och försöker sedan lägga till en ny uppgift igen.

Kompletteringsservice

CompletionService är ett tjänstegränssnitt med frikoppling av att starta asynkrona uppgifter och få resultat. För att lägga till uppgifter finns det en inlämningsmetod, och för att få resultat av redan genomförda uppgifter används en blockeringsmetodochenicke-blockerandepollmetod.

ExecutorCompletionService är ett omslag över alla klasser som implementerar Executor- gränssnittet , såsom ThreadPoolExecutor eller ForkJoinPool . Den används när det är nödvändigt att abstrahera från metoden för att starta uppgifter och kontrollera deras utförande.

Om det finns slutförda uppgifter så drar vi ut dem. Finns det inga uppgifter så hänger vi med tills något är klart. Tjänsten använder en LinkedBlockingQueue i sin kärna, men du kan skicka in vilken BlockingQueue-implementering som helst.