`Callable` і `Future` в Java

1. Інтерфейс Callable

Callable подібний до Runnable, але є суттєва різниця — він може повертати значення і може кидати виключення. У той час як метод Runnable.run() не повертає нічого і не може кидати виключення, метод Callable.call() повертає значення і може кидати виключення.

2. Інтерфейс Future

Future — це об'єкт, який представляє результат асинхронного завдання. Ви можете використовувати Future, щоб перевіряти стан завдання та отримати результат від Callable після його завершення.

Приклад використання Callable та Future в Java:

import java.util.concurrent.Callable;  
import java.util.concurrent.ExecutionException;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.Future;  

public class CallableFutureExample {  
public static void main(String[] args) {  
// Створення ExecutorService з одним потоком  
ExecutorService executor = Executors.newSingleThreadExecutor();  
 // Створення Callable, який повертає результат у вигляді цілого числа  
 Callable task = new Callable() {  
 @Override  
 public Integer call() throws Exception {  
 System.out.println("Завдання розпочато");  
 // Припустимо, що є складне обчислювальне завдання  
 Thread.sleep(2000); // Імітація довготривалого завдання  
 System.out.println("Завдання завершено");  
 return 42; // Повернення результату  
 }  
 };  

 // Надсилання завдання в executor і отримання Future  
 Future future = executor.submit(task);  

 try {  
 // Очікування результату від Callable  
 Integer result = future.get(); // get() заблокує потік до отримання результату  
 System.out.println("Результат від завдання: " + result);  
 } catch (InterruptedException | ExecutionException e) {  
 e.printStackTrace();  
 } finally {  
 executor.shutdown(); // Закриття ExecutorService  
 }  
}  
}
  • Callable: Ми створюємо Callable, у якому в методі call() імітується довготривале завдання (наприклад, Thread.sleep(2000)).
  • ExecutorService: Створюємо ExecutorService, використовуючи метод Executors.newSingleThreadExecutor(), щоб створити один потік.
  • Future: Після того, як ми надіслали Callable до ExecutorService, ми отримуємо об'єкт Future, який представляє результат завдання. Future.get() заблокує потік до завершення завдання і поверне результат (або кине виключення, якщо сталася помилка).

Переваги використання Callable та Future:

  • Callable може повертати результат або кидати виключення, що є корисним у багатопотокових додатках.
  • Future дозволяє перевіряти стан завдання та легко отримати результат.

Декілька методів інтерфейсу Future:

  • get(): Очікує завершення завдання і повертає результат.
  • cancel(boolean mayInterruptIfRunning): Скасовує завдання.
  • isDone(): Перевіряє, чи завершено завдання.
  • isCancelled(): Перевіряє, чи було завдання скасовано.

Перекладено з: Callable và Future trong Java

Leave a Reply

Your email address will not be published. Required fields are marked *