1. Runnable об'єкти

Ось ми і дісталися до найбільшої частини пакета. Тут описуватимуться інтерфейси для запуску асинхронних завдань із можливістю отримати результати через Future та Callable інтерфейси, а також сервіси та фабрики для створення thread pools: ThreadPoolExecutor, ScheduledPoolExecutor, ForkJoinPool.

Для кращого розуміння зробимо невелику декомпозицію інтерфейсів та класів.

2. Реалізації runnable об'єктів

Future<V> — чудовий інтерфейс для отримання результатів роботи асинхронної операції. Ключовим методом тут є метод get, який блокує поточний потік (з таймаутом або без) до завершення роботи асинхронної операції в іншому потоці. Також додатково існують методи для скасування операції та перевірки поточного статусу. Як імплементацію часто використовується клас FutureTask.

RunnableFuture<V> — якщо Future – це інтерфейс для Client API, інтерфейс RunnableFuture вже використовується для запуску асинхронної частини. Успішне завершення методу run() завершує асинхронну операцію та дозволяє витягувати результати через метод get.

Callable<V> — розширений аналог інтерфейсу Runnable для асинхронних операцій. Дозволяє повертати типізоване значення та кидати checked exception. Незважаючи на те, що в цьому інтерфейсі немає методу run(), багато класів java.util.concurrent підтримують його поряд з Runnable.

FutureTask<V> — імплементація інтерфейсу Future/RunnableFuture. Асинхронна операція приймається на вхід одного з конструкторів як Runnable або Callable об'єктів. Сам клас FutureTask призначений для запуску в worker потоці, наприклад, через new Thread(task).start() або через ThreadPoolExecutor. Результати асинхронної операції витягуються через метод get(...).

Delayed — використовується для асинхронних завдань, які мають розпочатися у майбутньому, а також у DelayQueue. Дозволяє встановлювати час до початку асинхронної операції.

ScheduledFuture<V> — маркерний інтерфейс, що поєднує Future та Delayed інтерфейси.

RunnableScheduledFuture<V> — інтерфейс, що поєднує RunnableFuture та ScheduledFuture. Додатково можна вказувати, чи є завдання одноразовим чи має запускатися зі встановленою періодичністю.