Callable в Java
Last updated: 7 мая 2025 г.До этого мы рассматривали создание потоков с помощью Thread и Runnable. Последний вариант того как можно создать класс потока это реализовать Callable
.
Callable – как Runnable, только вместо run() – call()
, который может возвращать значение, то есть благодаря call поток может вернуть значение.
FutureTask
– для взаимодействия с потоками. Он для получения результата выполнения потока (того, что вернет call), еще имеет методы проверки состояния потока.
С помощью метода get()
класса FutureTask можно получить результат выполнения потока когда он завершит свое выполнение.
get() блокирует поток, в котором он был вызван пока не выполниться поток переданный в объект FutureTask.
Из также важных методов – с помощью isDone()
можем проверить завершился ли уже поток или еще нет.
Пример программы:
1import java.io.*;
2import java.util.*;
3import java.util.concurrent.Callable;
4import java.util.concurrent.FutureTask;
5
6class CallableFutureExample {
7 public static void main(String[] args) throws Exception {
8 FutureTask<Integer> futTask =
9 new FutureTask(new MyCallable());
10 Thread t = new Thread(futTask);
11 t.start();
12 //main останавливается и get ждет пока
13 //нить t не выполнится и после этого
14 //возвращает значение метода call.
15 System.out.println("Counter: " + futTask.get());
16 }
17}
18
19class MyCallable implements Callable {
20 public Integer call() throws Exception {
21 Integer j=0;
22 try {
23 for (int i = 0; i < 5; i++) {
24 j++;
25 System.out.println("j = " + j);
26 Thread.sleep(1000);
27 }
28 } catch(Exception e) {
29 return j; //возвращаем j, который
30 //будет помещен в FutureTask
31 }
32 return j;
33 }
34}
Вывод:

Как видим, get остановил мейн пока выполнялся поток t и когда t выполнился, мейн снова запустился и вывел Counter: 5
Следующие уроки
ExecutorService: управление пулом потоков
15
мин.
ReadWriteLock в Java
15
мин.
ThreadLocal в Java: переменные потока
16
мин.