Eksekutør

Executor er basisgrænsefladen for klasser, der implementerer lanceringen af ​​Runnable -opgaver. Dette giver hjælp til at tilføje en opgave, og hvordan man starter den.

ExecutorService er en grænseflade, der udvider egenskaberne for Executor , og som beskriver en service til at køre Runnable eller Callable opgaver. Afsendelsesmetoderne accepterer en opgave i form af en Callable eller Runnable som input , og en Future bruges som returværdi, hvorigennem du kan få resultatet.

Metoden invokeAll er ansvarlig for at udføre opgaver, returnere en liste over opgaver med deres status og færdiggørelsesresultater.

Metoden invokeAny er ansvarlig for at udføre opgaver, returnere resultatet af en vellykket udført opgave (det vil sige uden at kaste en undtagelse), hvis nogen.

ScheduledExecutorService - denne grænseflade tilføjer muligheden for at køre afventende opgaver med en vis forsinkelse eller en bestemt periode.

AbstractExecutorService er en abstrakt klasse til at konstruere en ExecutorService 'a. Indeni er der en implementering af submit , invokeAll , invokeAny metoderne . Denne klasse arver ThreadPoolExecutor , ScheduledThreadPoolExecutor og 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 er en fabriksklasse til at skabe ThreadPoolExecutor , ScheduledThreadPoolExecutor . Hvis du skal lave en af ​​disse pools, så er denne fabrik præcis, hvad du har brug for. Den indeholder forskellige adaptere Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable og andre. Har statiske metoder til at skabe forskellige ThreadPool .

ThreadPoolExecutor - Implementerer Executor- og ExecutorService- grænsefladerne og adskiller opgaveoprettelse fra opgaveudførelse. Vi skal implementere Kørbare objekter og sende dem til udføreren, og ThreadPoolExecutor er ansvarlig for deres udførelse, instansiering og arbejde med tråde.

ScheduledThreadPoolExecutor - Ud over ThreadPoolExecutor- metoderne opretter den en pulje af tråde, der kan planlægge kommandoer til at udføre efter en given forsinkelse eller til periodisk udførelse.

ThreadFactoryer et objekt, der skaber nye tråde efter behov. Vi skal videregive en instans til Executors.newSingleThreadExecutor(ThreadFactory threadFactory) metoden .

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 - giver dig mulighed for at definere en handler for opgaver, der af en eller anden grund ikke kan udføres gennem ThreadPoolExecutor . Dette sker, når der ikke er nogen gratis streams, eller tjenesten er lukket eller lukket.

Adskillige standardimplementeringer findes i ThreadPoolExecutor- klassen :

  • CallerRunsPolicy - kører en opgave på den kaldende tråd;
  • AbortPolicy - kaster en undtagelse;
  • DiscardPolicy - ignorerer opgaven;
  • DiscardOldestPolicy - Fjerner den ældste ustartede opgave fra køen, og forsøger derefter at tilføje en ny opgave igen.

Færdiggørelsesservice

CompletionService er en servicegrænseflade med afkobling af lancering af asynkrone opgaver og opnåelse af resultater. For at tilføje opgaver er der en submit-metode, og for at få resultaterne af allerede udførte opgaver bruges en blokeringsmetodeogen ikke-blokerendeafstemningsmetode.

ExecutorCompletionService er en indpakning over enhver klasse, der implementerer Executor- grænsefladen , såsom ThreadPoolExecutor eller ForkJoinPool . Det bruges, når det er nødvendigt at abstrahere fra metoden til at starte opgaver og kontrollere deres udførelse.

Hvis der er udførte opgaver, så trækker vi dem ud. Hvis der ikke er opgaver, så hænger vi i take indtil noget er gennemført. Tjenesten bruger en LinkedBlockingQueue i sin kerne, men du kan passere enhver BlockingQueue-implementering.