Изпълнител

Executor е базовият интерфейс за класове, който реализира стартирането на Runnable задачи. Това осигурява помощ при добавяне на задача и How да я стартирате.

ExecutorService е интерфейс, който разширява свойствата на Executor и който описва услуга за изпълнение на Runnable or Callable задачи. Методите за изпращане приемат задача под формата на Callable or Runnable като вход , а Future се използва като върната стойност, чрез която можете да получите резултата.

Методът invokeAll отговаря за изпълнението на задачи, като връща списък от задачи с техния статус и резултати от изпълнението.

Методът invokeAny е отговорен за изпълнението на задачи, връщайки резултата от успешно завършена задача (тоест, без хвърляне на изключение), ако има такова.

ScheduledExecutorService – този интерфейс добавя възможност за изпълнение на чакащи задачи с определено закъснение or определен период.

AbstractExecutorService е абстрактен клас за конструиране на ExecutorService 'a. Вътре има имплементация на методите submit , invokeAll , invokeAny . Този клас наследява ThreadPoolExecutor , ScheduledThreadPoolExecutor и 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 е фабричен клас за създаване на ThreadPoolExecutor , ScheduledThreadPoolExecutor . Ако трябва да създадете един от тези басейни, тогава тази фабрика е точно това, от което се нуждаете. Той съдържа различни адаптери Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable и други. Има статични методи за създаване на различни ThreadPool .

ThreadPoolExecutor – Внедрява интерфейсите Executor и ExecutorService и разделя създаването на задача от изпълнението на задача. Трябва да имплементираме Runnable обекти и да ги изпратим на изпълнителя, а ThreadPoolExecutor отговаря за тяхното изпълнение, инстанциране и работа с нишки.

ScheduledThreadPoolExecutor – В допълнение към методите ThreadPoolExecutor , той създава набор от нишки, които могат да планират команди за изпълнение след дадено забавяне or за периодично изпълнение.

ThreadFactoryе обект, който създава нови нишки при поискване. Трябва да предадем екземпляр на метода 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 - позволява ви да дефинирате манипулатор за задачи, които по няHowва причина не могат да бъдат изпълнени чрез ThreadPoolExecutor . Това се случва, когато няма безплатни потоци or услугата е затворена or изключена.

Няколко стандартни реализации се намират в класа ThreadPoolExecutor :

  • CallerRunsPolicy - изпълнява задача на извикващата нишка;
  • AbortPolicy - хвърля изключение;
  • DiscardPolicy - игнорира задачата;
  • DiscardOldestPolicy - Премахва най-старата нестартирала задача от опашката, след което се опитва да добави нова задача отново.

Услуга за завършване

CompletionService е сервизен интерфейс с отделяне на стартирането на асинхронни задачи и получаване на резултати. За добавяне на задачи има методза изпращане, а за получаване на резултатите от вече завършени задачи се използват блокиращза вземанеи неблокиращза анкета.

ExecutorCompletionService е обвивка на всеки клас, който имплементира интерфейса на Executor , като ThreadPoolExecutor or ForkJoinPool . Използва се, когато е необходимо да се абстрахира от метода за стартиране на задачи и контрол на тяхното изпълнение.

Ако има изпълнени задачи, тогава ги изваждаме. Ако няма задачи, чакаме, докато нещо не бъде завършено. Услугата използва LinkedBlockingQueue в основата си, но можете да подадете всяка реализация на BlockingQueue.