Executor

Executor é a interface base para classes que implementa o lançamento de tarefas Runnable . Isso fornece assistência para adicionar uma tarefa e como iniciá-la.

ExecutorService é uma interface que estende as propriedades de Executor e que descreve um serviço para executar tarefas Runnable ou Callable . Os métodos de envio aceitam uma tarefa na forma de Callable ou Runnable como entrada e um Future é usado como valor de retorno, por meio do qual você pode obter o resultado.

O método invokeAll é responsável por executar tarefas, retornando uma lista de tarefas com seus status e resultados de conclusão.

O método invokeAny é responsável por executar tarefas, retornando o resultado de uma tarefa concluída com sucesso (ou seja, sem lançar uma exceção), se houver.

ScheduledExecutorService - esta interface adiciona a capacidade de executar tarefas pendentes com um certo atraso ou um determinado período.

AbstractExecutorService é uma classe abstrata para construir um ExecutorService 'a. Dentro há uma implementação dos métodos submit , invokeAll , invokeAny . Esta classe herda ThreadPoolExecutor , ScheduledThreadPoolExecutor e 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 é uma classe de fábrica para criar ThreadPoolExecutor , ScheduledThreadPoolExecutor . Se você precisa criar um desses pools, essa fábrica é exatamente o que você precisa. Ele contém diferentes adaptadores Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable e outros. Possui métodos estáticos para criar diferentes ThreadPool .

ThreadPoolExecutor - Implementa as interfaces Executor e ExecutorService e separa a criação da tarefa da execução da tarefa. Precisamos implementar objetos Runnable e enviá-los ao executor, e ThreadPoolExecutor é responsável por sua execução, instanciação e trabalho com threads.

ScheduledThreadPoolExecutor - Além dos métodos ThreadPoolExecutor , cria um pool de threads que podem agendar comandos para serem executados após um determinado atraso ou para execução periódica.

ThreadFactoryé um objeto que cria novos encadeamentos sob demanda. Precisamos passar uma instância para o método 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 - permite definir um manipulador para tarefas que, por algum motivo, não podem ser executadas por meio do ThreadPoolExecutor . Isso acontece quando não há streams gratuitos ou o serviço é desligado ou encerrado.

Várias implementações padrão são encontradas na classe ThreadPoolExecutor :

  • CallerRunsPolicy - executa uma tarefa no thread de chamada;
  • AbortPolicy - lança uma exceção;
  • DiscardPolicy - ignora a tarefa;
  • DiscardOldestPolicy - Remove a tarefa não iniciada mais antiga da fila e tenta adicionar uma nova tarefa novamente.

Serviço de conclusão

CompletionService é uma interface de serviço com desacoplamento de iniciar tarefas assíncronas e obter resultados. Para adicionar tarefas, existe um métodosubmit, e para obter os resultados de tarefas já concluídas, são usados ​​umtakepollnão bloqueador.

ExecutorCompletionService é um wrapper sobre qualquer classe que implemente a interface Executor , como ThreadPoolExecutor ou ForkJoinPool . É usado quando é necessário abstrair do método de lançamento de tarefas e controlar sua execução.

Se houver tarefas concluídas, nós as retiramos. Se não houver tarefas, aguardamos até que algo seja concluído. O serviço usa um LinkedBlockingQueue em seu núcleo, mas você pode transmitir qualquer implementação de BlockingQueue.