Топ-100Callable в Java - CodOrbits
LogoCodOrbits

Раздел: Многопоточность

В этом разделе вы узнаете, как использовать многопоточность в Java для повышения производительности и параллельной обработки.

Все разделы
Иконка Многопоточность

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
мин.

Similar Articles Icon
Divider

ReadWriteLock в Java

15
мин.

Similar Articles Icon
Divider

ThreadLocal в Java: переменные потока

16
мин.

Similar Articles Icon