Wykonawca

Executor to podstawowy interfejs dla klas, który implementuje uruchamianie zadań Runnable . Zapewnia to pomoc przy dodawaniu zadania i sposobie jego uruchamiania.

ExecutorService to interfejs rozszerzający właściwości Executora i opisujący usługę do uruchamiania zadań Runnable lub Callable . Metody przesyłania akceptują zadanie w postaci Callable lub Runnable jako dane wejściowe , a Future jest używane jako wartość zwracana, dzięki której można uzyskać wynik.

Za wykonywanie zadań odpowiada metoda invokeAll , zwracająca listę zadań wraz z ich statusem i wynikami wykonania.

Metoda invokeAny jest odpowiedzialna za wykonywanie zadań, zwracanie wyniku pomyślnie zakończonego zadania (czyli bez zgłaszania wyjątku), jeśli taki istnieje.

ScheduledExecutorService — ten interfejs dodaje możliwość uruchamiania oczekujących zadań z określonym opóźnieniem lub określonym okresem.

AbstractExecutorService to abstrakcyjna klasa służąca do konstruowania usługi ExecutorService „a. Wewnątrz znajduje się implementacja metod submit , invokeAll , invokeAny . Ta klasa dziedziczy ThreadPoolExecutor , ScheduledThreadPoolExecutor i 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 to klasa fabryczna służąca do tworzenia ThreadPoolExecutor , ScheduledThreadPoolExecutor . Jeśli potrzebujesz utworzyć jedną z tych pul, ta fabryka jest dokładnie tym, czego potrzebujesz. Zawiera różne adaptery Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable i inne. Ma statyczne metody tworzenia różnych ThreadPool .

ThreadPoolExecutor — implementuje interfejsy Executor i ExecutorService i oddziela tworzenie zadań od wykonywania zadań. Musimy zaimplementować obiekty Runnable i wysłać je do executora, a ThreadPoolExecutor odpowiada za ich wykonanie, tworzenie instancji i pracę z wątkami.

ScheduledThreadPoolExecutor — oprócz metod ThreadPoolExecutor tworzy pulę wątków, które mogą planować wykonywanie poleceń po określonym opóźnieniu lub wykonywanie okresowe.

Fabryka wątkówjest obiektem, który tworzy nowe wątki na żądanie. Musimy przekazać instancję do metody 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 — umożliwia zdefiniowanie procedury obsługi zadań, które z jakiegoś powodu nie mogą zostać wykonane przez ThreadPoolExecutor . Dzieje się tak, gdy nie ma bezpłatnych transmisji lub usługa jest wyłączona lub wyłączona.

W klasie ThreadPoolExecutor znajduje się kilka standardowych implementacji :

  • CallerRunsPolicy — uruchamia zadanie w wątku wywołującym;
  • AbortPolicy - zgłasza wyjątek;
  • DiscardPolicy — ignoruje zadanie;
  • DiscardOldestPolicy — usuwa najstarsze nierozpoczęte zadanie z kolejki, a następnie próbuje ponownie dodać nowe zadanie.

Usługa ukończenia

CompletionService to interfejs usługi z oddzieleniem uruchamiania zadań asynchronicznych i uzyskiwania wyników. Aby dodać zadania, istnieje metodaprzesyłania, a aby uzyskać wyniki już ukończonych zadań, używana jest metoda blokowaniapobieraniai nieblokującaankiety.

ExecutorCompletionService jest opakowaniem dla dowolnej klasy, która implementuje interfejs Executor , takiej jak ThreadPoolExecutor lub ForkJoinPool . Stosuje się go, gdy konieczne jest oderwanie się od sposobu uruchamiania zadań i kontrolowania ich wykonania.

Jeśli są ukończone zadania, wyciągamy je. Jeśli nie ma żadnych zadań, to zwlekamy, aż coś zostanie ukończone. Usługa wykorzystuje LinkedBlockingQueue w swojej istocie, ale możesz przekazać dowolną implementację BlockingQueue.