Javaで継続の適切な実装はありますか?
もしそうなら、オーバーヘッドはどのようなものですか?JVMは、このようなことを念頭に置いて設計されていませんでしたね。それで、この種の穀物に反対するのですか?
Javaで継続の適切な実装はありますか?
もしそうなら、オーバーヘッドはどのようなものですか?JVMは、このようなことを念頭に置いて設計されていませんでしたね。それで、この種の穀物に反対するのですか?
Apache Javaflow http://commons.apache.org/sandbox/javaflow/を参照してください。
これは、活発に開発中の Java の唯一の継続パッケージです。もう 1 つの RIFE は、どの状態かわかりません。
Javaflow http://commons.apache.org/sandbox/javaflow/ Play フレームワークは Javaflow を使用 http://blog.heroku.com/archives/2011/8/29/play/
RIFE http://www.artima.com/lejava/articles/continuations.html WebWork 使用。
JauVM http://jauvm.blogspot.com/2005/07/so-what-does-it-do.html JVM の JVM、末尾呼び出し/継続を実装
スカラ 2.8 http://www.scala-lang.org/node/2096
コクーン http://cocoon.apache.org/2.1/userdocs/flow/continuations.html http://wiki.apache.org/cocoon/RhinoWithContinuations
Jetty http://docs.codehaus.org/display/JETTY/Continuations 再試行リクエスト。
コルーチン http://code.google.com/p/coroutines
jconts https://github.com/idubrov/jconts
jyield http://code.google.com/p/jyield
キリム http://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf
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
});
暗黙の継続を気にしないのであれば、Kilimは素晴らしいオプションです。注釈付きメソッドを処理し、バイトコードで継続を生成することで機能します。フレームワークであるため、明らかに多くのことを実行しますが、スレッドセーフな継続の(優れた)パフォーマンスが必要な場合は、一見の価値があります。
私がこれを正しく理解していれば、明らかな問題は、クロージャ インスタンスがアクティブな状態でスタックを巻き戻すことに関係していると思います。レキシカル スコープを持つ言語は、理論的には、子フレームがクロージャ インスタンスを作成し、参照される中間フレームを識別し、それらのフレームを単にスタックにプッシュするのではなく、malloc できることを理解できると思います。
さらに言えば、コンパイラは、グローバルにバインドされていないオブジェクトを参照するクロージャのすべてのフレームまたはすべての親フレームを malloc する可能性があります。
JVM が実際のマシン以上にクロージャーを制限しているとは思いません。単に一般的なスタック パラダイムと戦っているため、通常はパントされます。
遊ぶ!フレームワーク バージョン 1.2.x は、非同期 http グッズと統合された継続もサポートしています。