ExecutorService Интерфейс

Интерфейс java.util.concurrent.ExecutorService является подчиненным интерфейсом интерфейса Executor и добавляет функции для управления жизненным циклом как отдельных задач, так и самого исполнителя.

Методы ExecutorService

Sr. No. Метод и описание
1

boolean awaitTermination(long timeout, TimeUnit unit)

Блокирует до тех пор, пока все задачи не завершат выполнение после запроса на выключение, или пока не истечет время ожидания, или пока текущий поток не будет прерван, в зависимости от того, что произойдет раньше.

2

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)

Выполняет заданные задачи, возвращая список Futures с их статусом и результатами, когда все выполнено.

3

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

Выполняет заданные задачи, возвращая список Futures с их статусом и результатами, когда все выполнено или истечет время ожидания, в зависимости от того, что произойдет раньше.

4

<T> T invokeAny(Collection<? extends Callable<T>> tasks)

Выполняет заданные задачи, возвращая результат одной из успешно выполненных (т. Е. Без создания исключения), если таковые были.

5

<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

Выполняет заданные задачи, возвращая результат одной из успешных (т. Е. Без создания исключения), если они выполняются до истечения заданного тайм-аута.
6

boolean isShutdown()

Возвращает истину, если этот исполнитель был выключен.

7

boolean isTerminated()

Возвращает истину, если все задачи были выполнены после завершения работы.

8

void shutdown()

Инициирует упорядоченное завершение работы, при котором ранее отправленные задачи выполняются, но новые задачи не принимаются.

9

List<Runnable> shutdownNow()

Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения.

10

<T> Future<T> submit(Callable<T> task)

Отправляет на выполнение задачу, возвращающую значение, и возвращает Future, представляющий ожидающие результаты задачи.

11

Future<?> submit(Runnable task)

Отправляет на выполнение задачу Runnable и возвращает Future, представляющую эту задачу.

12

<T> Future<T> submit(Runnable task, T result)

Отправляет на выполнение задачу Runnable и возвращает Future, представляющую эту задачу.

пример

Следующая программа TestThread показывает использование интерфейса ExecutorService в среде на основе потоков.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException {
      ExecutorService executor = Executors.newSingleThreadExecutor();

      try {
         executor.submit(new Task());
         System.out.println("Shutdown executor");
         executor.shutdown();
         executor.awaitTermination(5, TimeUnit.SECONDS);
      } catch (InterruptedException e) {
         System.err.println("tasks interrupted");
      } finally {

         if (!executor.isTerminated()) {
            System.err.println("cancel non-finished tasks");
         }
         executor.shutdownNow();
         System.out.println("shutdown finished");
      }
   }

   static class Task implements Runnable {
      
      public void run() {
         
         try {
            Long duration = (long) (Math.random() * 20);
            System.out.println("Running Task!");
            TimeUnit.SECONDS.sleep(duration);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }	   
}

Это даст следующий результат.

Вывод

Shutdown executor
Running Task!
shutdown finished
cancel non-finished tasks
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:302)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
	at TestThread$Task.run(TestThread.java:39)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:662)