В однопользованном приложении, когда вы вызываете метод, результат будет возвращен только после окончания расчета.
Public String DownloadContents (URL URL) Throws IOException {tryStream input = url.openstream ()) {return ioutils.tring (input, standardc sharsets.utf_8);}} // ... окончательное будущее <strong> contents = downloadcontents (новый URL ("http://www.example.com");
DownloadContents () выглядит безвредно, но это должно быть сделано долгое время. В то же время, чтобы сократить задержку, во время результата ожидания вам может потребоваться выполнять другие работы независимо одновременно. В прошлом вы можете запустить новый поток или ждать результатов (обмен памятью, блокировку, Bad Wait ()/notify () пара).
В течение будущего режима <T> он станет ясным:
Public Static Future <string> startDownloading (URL URL) {// ...} окончательное будущее <string> contentsFuture = startDownload (new, http: //www.example .com ")); // Другое вычислительное финальное строки contents = contentsfuture .получать ();
Мы реализуем startDownloading (), startDownloading () не будет заблокирована, но ожидая ответа внешних сайтов. Наоборот, если он возвращается быстро и возвращает легкий будущий объект <string>. Этот объект является обещанием, поэтому будущий тип строки доступен. Другими словами, будущее - это агент или упаковка объекта, а не настоящий целевой объект. Как только асинхронное расчет будет завершен, вы можете извлечь его. Итак, какой интерфейс предоставляет будущее?
Future.get () - самый важный метод. Он блокирует и подождите, пока не будет доступен результат обещания, поэтому, если нам действительно нужна эта строка, вызовите метод get () и подождите. Существует также версия с тяжелой нагрузкой, которая принимает параметры тайм -аута.
В некоторых случаях вы можете тайно посмотреть, доступно ли будущее. Это можно сделать через Isdone (). Представьте себе ситуацию, ваш пользователь ждет некоторых асинхронных расчетов.
Окончательное будущее <string> contentsfuture = startDownloading (новый URL ("http://www.example.com"); while (! Contentsfuture.isdone ()) {askusertowail (); Do SomeecomputationIntheAntime (); ;;
Наконец, содержание Future.get () гарантированно вернется немедленно без блокировки, потому что Future.isdone () возвращает True. Если вы следите за этой моделью, вы не будете заняты ожиданием и вызовом Isdone () попеременно каждую секунду.
Отмена футов - последний, который мы не покрыли. Представьте, что вы начинаете асинхронную работу, и вы можете ждать только некоторое время. Тем не менее, вы хороший гражданин, вы должны рассказать об этом будущем объекте: вам больше не нужно, вам все равно. Затем вы можете сохранить ресурсы, остановив устаревшие задачи. Грамматика проста:
Содержимое FUTURE.Cancel (True);
Нам всем нравится скрывать, параметры типа бура, верно? Отмена может быть реализована двумя способами: до начала задачи ложный параметр отменяется, при условии, что до того, как результаты будущего выражаются, начались расчет. После того, как Callable.call () работает до половины, мы хотим, чтобы он закончился. Как вы думаете, это хорошо? Явления те, кто бросает прерывание, печально известный метод, такой как Thread.sleep (), object.wait (), conition.await () и т. Д., Даже если вы заблокированы в этом методе, и некоторые люди решают отменить ваш звонок Они, несомненно, бросят прерывание, и отправят кого -то, чтобы прервать задачу текущей операции.
Итак, теперь мы понимаем, что такое будущее-заполнитель, вы можете получить целевой объект в будущем. Как и автомобиль, нет ключа к производству. Но как вы можете получить экземпляр будущего в приложении? Двумя наиболее распространенными ресурсами являются пулы потоков и асинхронные методы (поддержка пула потоков). Следовательно, метод startDownloading () может быть переписан как:
Private Final Executorservice Pool = Executors.newfixedThreadpool (10); InputStream input = url.openstream ()) {return ioutils.tostring (input, standardcharsets.utf_8);}});}
Хотя существует много утомительных проблем с грамматикой, базовое мышление проще: упаковочные вычисления, которые должны работать в течение длительного времени, упакованы в регулируемый <string> и отправьте () в пул потоков. нить После отправки реализация будущего <string> похоже на то, чтобы каким -то образом ссылаться на вашу задачу и пул потоков. Очевидно, что ваша задача не будет выполнена сразу. Задача пребывания в середине также может отменить задачу, которая давно выполняется, но это более сложная вещь.
Вы также можете встретиться с будущим весной и EJB. Например, вы можете добавить аннотацию @Async в Spring Framework:
@AsyncPublic Future <string> startDownloading (окончательный URL URL) бросает ioException {try (inputStream input = url.openstream ()) {return new asyncres ult <> (ioutils.toString (input, standardcharsets.utf_8);}}}}}}}}}}}}}}}}}
Обратите внимание, что мы просто реализуем будущее через результат упаковки для Asyncresult, но сам этот метод не будет взаимодействовать с пулом потоков или обработанной асинхронной. Spring позже будет представлять все вызовы в startDownloading () и выполнить в пуле потоков. В EJB та же функция завершается путем добавления @Asynchronousannotation.