Продолжения на Java - PullRequest
       24

Продолжения на Java

28 голосов
/ 21 сентября 2009

Есть ли хорошая реализация продолжений в Java?

Если это так, каковы накладные расходы? JVM не была разработана с учетом подобных вещей, верно? Так это что-то против зерна?

Ответы [ 11 ]

12 голосов
/ 07 сентября 2010

См. Apache Javaflow http://commons.apache.org/sandbox/javaflow/

Это единственный пакет продолжения для Java, который активно разрабатывается. Другой, Райф, я не уверен, в каком состоянии он находится.

7 голосов
/ 21 сентября 2009

Jetty имеет продолжение поддержка. Дальнейшее обсуждение и некоторые образцы на DZone .

Я не могу консультировать по вопросам эффективности или иным образом, кроме как сказать, что команда Mortbay всегда кажется сознательной из таких вопросов. Скорее всего, где-то на сайте Jetty будет обсуждаться компромисс между реализацией.

2 голосов
/ 09 мая 2015

Начиная с Java 8, теперь существует класс CompletableFuture<T>, который поддерживает продолжения и более функциональные / реактивные подходы программирования.

Рассмотрим следующий пример, где класс предлагает метод downloadAndResize:

public CompletableFuture<Image> downloadAndResize(String imageUrl, int width, int height) {
    return CompletableFuture
        .supplyAsync(() -> downloadImage(imageUrl))
        .thenApplyAsync(x -> resizeImage(x, width, height));
}

private Image downloadImage(String url){
    // TODO Download the image from the given url...
}

private Image resizeImage(Image source, int width, int height){
    // TODO Resize the image to w / h
}

Использование вышеуказанного метода может выглядеть следующим образом:

CompletableFuture<Image> imagePromise = downloadAndResize("http://some/url", 300, 200);

imagePromise.thenAccept(image -> {
    // Gets executed when the image task has successfully completed

    // do something with the image

});
2 голосов
/ 13 августа 2012

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

2 голосов
/ 21 сентября 2009

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

В этом отношении компилятор может распределять все кадры или все родительские кадры замыкания, ссылаясь на объект, не связанный с глобальными объектами.

Краткое описание

Я не думаю, что JVM ограничивает замыкания больше, чем реальная машина, просто они борются с общей парадигмой стека и поэтому их обычно наказывают.

1 голос
/ 25 августа 2018

Рассмотрим также Kotlin Coroutines .

Это реализовано с помощью потенциально более производительных CPS-преобразований ( все еще стека ) и может использовать любой асинхронный исполнитель под капотом, например, ForkJoinPool или Quasar .

Поставляется с удобным руководствуясь библиотека .

Остерегайтесь некоторых инструментов и отражения подводных камней.

1 голос
/ 13 июня 2016

Недавно появился еще один сильный конкурент.

Квазар использует разветвленный из реализации Матиасом Манном java продолжений для обеспечения функций более высокого уровня, таких как легкие потоки , Erlang-подобные актеры и Go-подобные сопрограммы и каналы .

В блоге Quasar .

имеется множество тестов и подробных введений.

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

Quasar также предоставляет хороший API Kotlin, который был представлен на недавнем вебинаре JetBrains Квазар: эффективные и элегантные волокна, каналы и актеры .

Все упомянутое с открытым исходным кодом и бесплатное использование.

См. Также http://blog.paralleluniverse.co/2015/08/07/scoped-continuations/


Обновление

Опыт Quasar позже был использован в качестве основы для Loom Project , цель которого - обеспечить поддержку продолжений непосредственно в JVM, когда-то после Java 11.

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

1 голос
/ 19 октября 2012

Играть! Framework Framework 1.2.x также имеет поддержку продолжений , интегрированную с асинхронными http вкусностями.

Обратите внимание, что Продолжения Play 1.2.x работают только со встроенным сервером Netty .

И Play 2.x по-прежнему не поддерживает продолжения .

0 голосов
/ 23 апреля 2014

Другая библиотека Матиаса Манна:

http://www.matthiasmann.de/content/view/24/26/

http://www.matthiasmann.de/java/Continuations/

...