Бесплатный курс по Java: от основ до продвинутого уровня
Callable в Java
До этого мы рассматривали создание потоков с помощью Thread и Runnable. Последний вариант того как можно создать класс потока это реализовать Callable.
Callable – как Runnable, только вместо run() – call(), который может возвращать значение, то есть благодаря call поток может вернуть значение.
FutureTask – для взаимодействия с потоками. Он для получения результата выполнения потока (того, что вернет call), еще имеет методы проверки состояния потока.
С помощью метода get() класса FutureTask можно получить результат выполнения потока когда он завершит свое выполнение.
get() блокирует поток, в котором он был вызван пока не выполниться поток переданный в объект FutureTask.
Из также важных методов – с помощью isDone() можем проверить завершился ли уже поток или еще нет.
Пример программы:
import java.io.*;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class CallableFutureExample {
public static void main(String[] args) throws Exception {
FutureTask futTask =
new FutureTask(new MyCallable());
Thread t = new Thread(futTask);
t.start();
//main останавливается и get ждет пока
//нить t не выполнится и после этого
//возвращает значение метода call.
System.out.println(“Counter: ” + futTask.get());
}
}
class MyCallable implements Callable {
public Integer call() throws Exception {
Integer j=0;
try {
for (int i = 0; i < 5; i++) {
j++;
System.out.println("j = " + j);
Thread.sleep(1000);
}
} catch(Exception e) {
return j; //возвращаем j, который
//будет помещен в FutureTask
}
return j;
}
}
Вывод:
Как видим, get остановил мейн пока выполнялся поток t и когда t выполнился, мейн снова запустился и вывел Counter: 5
Изучите ExecutorService в Java для эффективного управления пулом потоков. Уменьшайте накладные расходы, переиспользуя потоки в многопоточных приложениях.
Time to read: 15
ReadWriteLock в Java
Узнайте, как ReadWriteLock в Java разделяет блокировки на чтение и запись. Оптимизируйте многопоточный доступ к ресурсам с примерами кода и объяснениями.
Time to read: 15
ThreadLocal в Java: переменные потока
ThreadLocal в Java: создавайте потокобезопасные переменные, уникальные для каждого потока. Пример использования и работа с потоконебезопасными объектами.