6.1 Obiekty wykonywalne
Dotarliśmy więc do największej części pakietu. Opisane zostaną interfejsy do uruchamiania zadań asynchronicznych z możliwością uzyskiwania wyników poprzez interfejsy Future i Callable, a także usługi i fabryki do tworzenia pul wątków: ThreadPoolExecutor, ScheduledPoolExecutor, ForkJoinPool.
Dla lepszego zrozumienia dokonajmy małej dekompozycji interfejsów i klas.
6.2 Realizacje obiektów wykonywalnych
Future<V>
to wspaniały interfejs do uzyskiwania wyników operacji asynchronicznej. Kluczową metodą jest tutaj metoda get, która blokuje bieżący wątek (z limitem czasu lub bez) do czasu zakończenia operacji asynchronicznej w innym wątku. Istnieją również dodatkowe metody anulowania operacji i sprawdzenia aktualnego stanu. Klasa FutureTask jest często używana jako implementacja.
RunnableFuture<V>
- jeśli Future jest interfejsem API klienta, to interfejs RunnableFuture jest już używany do uruchamiania części asynchronicznej. Pomyślne zakończenie metody run() kończy operację asynchroniczną i umożliwia pobranie wyników za pomocą metody get.
Callable<V>
- Rozszerzony odpowiednik interfejsu Runnable dla operacji asynchronicznych. Umożliwia zwrócenie wpisanej wartości i zgłoszenie sprawdzonego wyjątku. Mimo że ten interfejs nie ma metody run(), wiele klas java.util.concurrent obsługuje ją wraz z Runnable.
FutureTask<V>
— wdrożenie interfejsu Future/RunnableFuture. Operacja asynchroniczna jest traktowana jako dane wejściowe do jednego z konstruktorów w postaci obiektów Runnable lub Callable. Sama klasa FutureTask jest zaprojektowana do uruchamiania w wątku roboczym, na przykład za pomocą new Thread(task).start() lub ThreadPoolExecutor. Wyniki operacji asynchronicznej są pobierane za pomocą metody get(...).
Delayed
- używany do zadań asynchronicznych, które powinny rozpocząć się w przyszłości, a także w DelayQueue. Umożliwia ustawienie czasu przed rozpoczęciem operacji asynchronicznej.
ScheduledFuture<V>
- interfejs znaczników, który łączy interfejsy Future i Delayed.
RunnableScheduledFuture<V>
- interfejs łączący RunnableFuture i ScheduledFuture. Dodatkowo możesz określić, czy zadanie jest zadaniem jednorazowym, czy też ma być uruchamiane z określoną częstotliwością.