Что такое фьючерсы?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

14
задан hippietrail 7 August 2012 в 12:07
поделиться

6 ответов

Существует статья Wikipedia о фьючерсах. Короче говоря, это - способ использовать значение, которое еще не известно. Значение может тогда быть вычислено по требованию (отложенные вычисления) и, дополнительно, одновременно с основным вычислением.

пример C++ следует.

<час>

Говорят, что Вы хотите вычислить сумму двух чисел. У Вас может или быть типичная нетерпеливая реализация:

int add(int i, int j) { return i + j; }
// first calculate both Nth_prime results then pass them to add
int sum = add(Nth_prime(4), Nth_prime(2)); 

или можно использовать способ фьючерсов использовать 11 C++ std::async, который возвращается std::future. В этом случае эти add функция только заблокируется, если она попытается использовать значение, которое еще не было вычислено (можно также создать чисто ленивую альтернативу).

int add(future<int> i, future<int> j) { return i.get() + j.get(); }
int sum = add(async(launch::async, [](){ return Nth_prime(4); }),
              async(launch::async, [](){ return Nth_prime(2); }));
9
ответ дан 1 December 2019 в 12:02
поделиться

При создании будущего новый фоновый поток запускается, который начинает вычислять действительное значение. Если Вы запросите значение будущего, то оно заблокируется, пока поток не закончил вычислять. Это очень полезно для того, когда Вы должны генерировать некоторые значения параллельно и не хотите вручную отслеживать все это.

См. lazy.rb для Ruby, или Scala, фьючерсы и отложенные вычисления.

Они могут, вероятно, быть реализованы на любом языке с потоками, хотя это, очевидно, было бы более трудно на низкоуровневом языке как C, чем на высокоуровневом функциональном языке.

7
ответ дан 1 December 2019 в 12:02
поделиться

Все упоминают фьючерсы в целях ленивого вычисления. Однако другое использование, которое как не рекламируется, является использованием фьючерсов для IO в целом. Особенно они полезны для загрузки файлов и ожидания на сетевых данных

6
ответ дан 1 December 2019 в 12:02
поделиться

Будущее инкапсулирует задержанное вычисление и является наиболее часто используемым к отложенным вычислениям рожка для обуви на неленивый язык. В первый раз, когда будущее оценено, код, требуемый оценить его, выполняется, и будущее заменяется результатом.

Так как будущее заменяется, последующие оценки не выполняют код снова и просто приводят к результату.

3
ответ дан 1 December 2019 в 12:02
поделиться

Статья Wiki дает хороший обзор фьючерсов. Понятие обычно используется в параллельных системах для планирования вычислений по значениям, которые могут или еще не могли быть вычислены, и далее, чье вычисление может или не может уже произойти.

От статьи:

будущее А связано с определенным потоком, который вычисляет его значение. Это вычисление может быть запущено или нетерпеливо когда будущее создается, или лениво когда его значение сначала необходимо.

Не упомянутый в статье, фьючерсы Монада , и таким образом, возможно к функциям проекта на будущих значениях в монаду относиться к ним будущее значение, когда это становится доступным, приводя к другому будущему, которое в свою очередь представляет результат той функции.

0
ответ дан 1 December 2019 в 12:02
поделиться

Фьючерсы также используются в определенных шаблонах проектирования, в частности, в шаблонах реального времени, например шаблоне ActiveObject, который отделяет вызов метода от выполнения метода. Будущее настроено на ожидание завершения выполнения. Я склонен видеть это, когда вам нужно перейти от многопоточной среды для связи с однопоточной средой. Могут быть случаи, когда часть оборудования не имеет поддержки ядра для потоковой передачи, и в этом случае используются фьючерсы. На первый взгляд не очевидно, как вы будете общаться, и, как ни удивительно, будущее делает это довольно просто. У меня есть немного кода на C #. Я выкопаю и выложу.

0
ответ дан 1 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: