Параллельное программирование с использованием Callable и Future
Наиболее распространенным способом выполнения параллельного программирования в Java является наследование класса потока или реализацию запускаемого интерфейса. Недостаток этих двух методов заключается в том, что результат выполнения не может быть получен непосредственно после выполнения задачи, и оно должно быть сообщено с помощью общих переменных или межполомы, что неудобно в использовании.
Начиная с Java 1.5, предоставляются каллируемые и будущие интерфейсы. Используя их, вы можете получить результат выполнения после выполнения задачи.
Давайте узнаем, как использовать Callable, Future и FutureTask.
Каллируемый интерфейс
Каллируемый интерфейс расположен в пакете java.util.concurrent. Это общий интерфейс, который объявляет только метод Call ():
Общедоступный интерфейс Callable <t> {t call () бросает исключение;}Как правило, он используется в сочетании с интерфейсом experserservice. Несколько перегруженных методов отправки объявлены в интерфейсе Exemortorservice:
<t> будущее <t> отправить (Callible <t> задача); <T> Future <t> отправить (выполняется задача, t result); Future <?> Отправить (выполняется задача);
Тип параметра в первом методе отправки является вызовом, а два других не охватываются этой статьей в настоящее время.
Будущее и футуретаск
Класс реализации будущего интерфейса может выполнять такие операции, как отмена, запрос и получение результатов на выполняемых или вызывших задачах.
Будущий интерфейс также расположен в пакете java.util.concurrent:
Публичный интерфейс Future <t> { /***Отмена задания*@param mayintruptifrunning*разрешает ли это отменять задачи, которые выполняются, но не завершены? Если true установлен, это означает, что задача в процессе может быть отменена *Если задача выполняется, она возвращает True *Если задача еще не выполнена, она возвращает истинность, является ли Mayinterruptifrunning True или False */ Boolean Cancel (Boolean May Interrastifrunning); /***Задача может быть успешно отменена? Если он успешно отменяется до того, как задача будет выполнена нормально, она возвращает True */ Boolean IsCancelled (); / ***Задается ли задание*/ boolean isdone (); / ***Получить результат выполнения через блокировку*/ t get () бросает прерывания, выполняя, выполняет Exection; /***Получите результат выполнения за счет блокировки. Если возврат не возвращается в указанное время, верните NULL */ T GET (длительный тайм -аут, единица времени UNIT) бросает прерывания, выполняет, выполнение Exception, TimeOutException;}Подводя итог, будущее предоставляет три функции:
Определите, выполняется ли задача и может прервать задачу и получить результат выполнения задачи
JDK предоставляет нам будущий класс реализации интерфейса FutureTask, который имеет следующие два конструктора.
Public FutureTask (Callable <t> Callable) {} public futureTask (Runnable Runnable, t result) {} Пример кода
Использование Callible, Future
import java.util.concurrent.*; public class test {public static void main (string [] args) {rececusterservice executorservice = experators.newcachedThreadpool (); Задача задачи = новая задача (); Future <Integer> future = rececusterService.submit (задача); executorservice.shutdown (); System.out.println («Основной поток выполняет задачу ...»); try {thread.sleep (2000); } catch (прерванное искусство ex) {ex.printstackTrace (); } try {System.out.println ("Запуск задачи Result:"+future.get ()); } catch (прерванное искусство ex) {ex.printstackTrace (); } catch (executionException ex) {ex.printStackTrace (); } System.out.println («Все задачи были выполнены»); }} класс задача реализует Callable <Integer> {@override public integer call () throws exception {system.out.println ("Детский поток выполняет задачу ..."); // задача моделирования занимает время потока времени. Sleep (5000); вернуть 1000; }}Результаты исполнения:
Детский поток выполняет задачу ... Основной поток выполняет задачу ... Результат работы задачи: 1000 Все задачи были выполнены
Используйте Callible, FutureTask
import java.util.concurrent.*; public class test {public static void main (string [] args) {rececusterservice executorservice = experators.newcachedThreadpool (); Задача задачи = новая задача (); FutureTask <Integer> futureTask = new FutureTask <Integer> (задача); executorservice.submit (futureTask); executorservice.shutdown (); System.out.println («Основной поток выполняет задачу ...»); try {thread.sleep (2000); } catch (прерванное искусство ex) {ex.printstackTrace (); } try {System.out.println ("Запуск задачи Result:"+futureTask.get ()); } catch (прерванное искусство ex) {ex.printstackTrace (); } catch (executionException ex) {ex.printStackTrace (); } System.out.println («Все задачи выполняются»); }} класс задача реализует Callable <Integer> {@override public integer call () throws exception {System.out.println («Детский поток выполняет задачу ...»); // моделирование задачи принимает Thread.sleep (5000); вернуть 1000; }}Результаты исполнения:
Детский поток выполняет задачу ... Основной поток выполняет задачу ... Результат работы задачи: 1000 Все задачи были выполнены
Суммировать
Выше приведено все содержание этой статьи об использовании Callable и Future для параллельного программирования в Java. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!