Uitvoerder

Executor is de basisinterface voor klassen die de lancering van Runnable- taken implementeert. Dit biedt hulp bij het toevoegen van een taak en het starten ervan.

ExecutorService is een interface die de eigenschappen van Executor uitbreidt en die een service beschrijft voor het uitvoeren van Runnable- of Callable -taken. De verzendmethoden accepteren een taak in de vorm van een Callable of Runnable als invoer , en een Future wordt gebruikt als een retourwaarde, waardoor u het resultaat kunt krijgen.

De methode invokeAll is verantwoordelijk voor het uitvoeren van taken en retourneert een lijst met taken met hun status en voltooiingsresultaten.

De methode invokeAny is verantwoordelijk voor het uitvoeren van taken en retourneert het resultaat van een succesvol voltooide taak (dat wil zeggen, zonder een uitzondering te genereren), indien van toepassing.

ScheduledExecutorService - deze interface voegt de mogelijkheid toe om lopende taken met een bepaalde vertraging of een bepaalde periode uit te voeren.

AbstractExecutorService is een abstracte klasse voor het bouwen van een ExecutorService 'a. Binnen is er een implementatie van de methodes submit , invokeAll , invokeAny . Deze klasse erft ThreadPoolExecutor , ScheduledThreadPoolExecutor en 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 is een fabrieksklasse voor het maken van ThreadPoolExecutor , ScheduledThreadPoolExecutor . Als je een van deze pools moet maken, dan is deze fabriek precies wat je nodig hebt. Het bevat verschillende adapters Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable en andere. Heeft statische methoden voor het maken van verschillende ThreadPool .

ThreadPoolExecutor - Implementeert de interfaces Executor en ExecutorService en scheidt het maken van taken van het uitvoeren van taken. We moeten Runnable- objecten implementeren en naar de uitvoerder sturen, en ThreadPoolExecutor is verantwoordelijk voor de uitvoering, instantiëring en het werken met threads.

ScheduledThreadPoolExecutor - Naast de ThreadPoolExecutor- methoden creëert het een pool van threads die opdrachten kunnen plannen om na een bepaalde vertraging of voor periodieke uitvoering uit te voeren.

Draadfabriekis een object dat op verzoek nieuwe threads maakt. We moeten een instantie doorgeven aan de Executors.newSingleThreadExecutor(ThreadFactory threadFactory) methode .

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 : hiermee kunt u een handler definiëren voor taken die om de een of andere reden niet kunnen worden uitgevoerd via de ThreadPoolExecutor . Dit gebeurt wanneer er geen gratis streams zijn of de service wordt afgesloten of afgesloten.

Verschillende standaardimplementaties zijn te vinden in de klasse ThreadPoolExecutor :

  • CallerRunsPolicy - voert een taak uit op de aanroepende thread;
  • AbortPolicy - genereert een uitzondering;
  • DiscardPolicy - negeert de taak;
  • DiscardOldestPolicy - Verwijdert de oudste niet-gestarte taak uit de wachtrij en probeert vervolgens opnieuw een nieuwe taak toe te voegen.

voltooiingsdienst

CompletionService is een service-interface met ontkoppeling van het starten van asynchrone taken en het verkrijgen van resultaten. Om taken toe te voegen, is er een verzendmethodeen om de resultaten van reeds voltooide taken te krijgen, wordt een blokkerendetake-en een niet-blokkerendepoll-.

ExecutorCompletionService is een wrapper over elke klasse die de Executor- interface implementeert , zoals ThreadPoolExecutor of ForkJoinPool . Het wordt gebruikt wanneer het nodig is om te abstraheren van de methode om taken te starten en de uitvoering ervan te controleren.

Als er voltooide taken zijn, halen we ze eruit. Als er geen taken zijn, dan wachten we totdat er iets is voltooid. De service gebruikt in de kern een LinkedBlockingQueue, maar u kunt elke BlockingQueue-implementatie doorgeven.