410013796724260
• Webmoney
R335386147728
Z369087728698
Concurrent интерфейсы Callable, FutureПри работе многопоточного приложения часто необходимо получение от потока результата его деятельности в виде некоторого объекта. Эту задачу можно решить с использованием интерфейсов Callable<V> и Future<V>. Совместное использование двух реализаций данных интерфейсов позволяет получить результат в виде некоторого объекта. Интерфейс Callable<V>Интерфейс Callable<V> очень похож на интерфейс Runnable. Объекты, реализующие данные интерфейсы, исполняются другим потоком. Однако, в отличие от Runnable, интерфейс Callable использует Generic'и для определения типа возвращаемого объекта. Runnable содержит метод run(), описывающий действие потока во время выполнения, а Callable – метод call(). С документацией интерфейса Callable<V> можно познакомиться здесь. Интерфейс Future<V>Интерфейс Future также, как и интерфейс Callable, использует Generic'и. Методы интерфейса можно использовать для проверки завершения работы потока, ожидания завершения и получения результата. Результат выполнения может быть получен методом get, если поток завершил работу. Прервать выполнения задачи можно методом cancel. Дополнительные методы позволяют определить завершение задачи : нормальное или прерванное. Если задача завершена, то прервать ее уже невозможно. Методы интерфейса Future
С документацией интерфейса Future<V> можно познакомиться здесь. Пример использования интерфейсов Callable, FutureРассмотрим простейший пример использования интерфейсов Callable и Future. Основная идея данного примера – показать, как можно, используя Future, узнать статус Callable потока и получить возвращенный объект. В примере используется объект executor типа ExecutorService, формирующий пул из трех потоков. Метод submit с параметром Callable возвращает объект Future для каждого из стартуемого потоков.
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutionException;
import java.text.SimpleDateFormat;
public class CallableExample
{
public CallableExample()
{
// Определяем пул из трех потоков
ExecutorService executor;
executor = Executors.newFixedThreadPool(3);
// Список ассоциированных с Callable задач Future
List<Future<String>> futures;
futures = new ArrayList<Future<String>>();
// Создание экземпляра Callable класса
Callable<String> callable = new CallableClass();
for (int i = 0; i < 3; i++){
/*
* Стартуем возвращаюший результат исполнения
* в виде объекта Future поток
*/
Future<String> future;
future = executor.submit(callable);
/*
* Добавляем объект Future в список для
* отображения результат выполнения (получение
* наименования потока)
*/
futures.add(future);
}
SimpleDateFormat sdf;
sdf = new SimpleDateFormat("HH:mm:ss ");
for (Future<String> future : futures){
try {
// Выводим в консоль полученное значение
String text = sdf.format(new Date())
+ future.get();
System.out.println(text);
} catch (InterruptedException |
ExecutionException e) {}
}
// Останавливаем пул потоков
executor.shutdown();
}
//-----------------------------------------------------
// Класс, реализующий интерфейс Callable
class CallableClass implements Callable<String>
{
@Override
public String call() throws Exception {
Thread.sleep(1000);
// наименование потока, выполняющего
// callable задачу
return Thread.currentThread().getName();
}
}
//-----------------------------------------------------
public static void main(String args[])
{
new CallableExample();
}
}
Класс CallableClass, реализующий интерфейс Callable, использует объект String в качестве generic'a. Соответственно и каждый объект Future также должен использовать тип объекта String. Результат выполненияПеред остановкой пула потоков в консоль выводятся наименования потока. Т.е. в примере демонстрируется возможность не прямого обращения к методу call класса, реализующего интерфейс Callable, а косвенно через объект Future, полученного при старте потока. 17:41:16 pool-1-thread-1 17:41:19 pool-1-thread-2 17:41:19 pool-1-thread-3 |
