問題タブ [kotlin-coroutines]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
8 に答える
56777 参照

java - Java でのコルーチンの実装

この質問は、 Java の既存のコルーチン実装に関する私の質問に関連しています。私が思うに、Java で現在利用可能なコルーチンの完全な実装がないことが判明した場合、それらを実装するには何が必要になるでしょうか?

その質問で述べたように、私は次のことを知っています。

  1. 舞台裏でスレッド/スレッドプールとして「コルーチン」を実装できます。
  2. コルーチンを可能にするために、バックグラウンドで JVM バイトコードを使用してトリッキーなことを行うことができます。
  3. いわゆる「Da Vinci Machine」JVM 実装には、バイトコード操作なしでコルーチンを実行可能にするプリミティブがあります。
  4. コルーチンに対するさまざまな JNI ベースのアプローチも可能です。

それぞれの欠点を順番に説明します。

スレッドベースのコルーチン

この「解決策」は病的です。コルーチンの要点は、スレッド化、ロック、カーネル スケジューリングなどのオーバーヘッドを回避することです。コルーチンは軽量で高速であり、ユーザー空間でのみ実行されるはずです。厳しい制限のあるフルティルト スレッドの観点からそれらを実装すると、すべての利点が取り除かれます。

JVM バイトコード操作

このソリューションは、実行するのが少し難しいですが、より実用的です。これは、C でコルーチン ライブラリのアセンブリ言語に飛び込むのとほぼ同じです (これは、多くのコルーチン ライブラリが機能します)。心配して適切に処理する必要があるアーキテクチャは 1 つだけであるという利点があります。

また、非準拠のスタックで同じことを行う方法を見つけられない限り、完全に準拠した JVM スタック (つまり、Android がないことを意味します) でのみコードを実行する必要があります。ただし、これを行う方法を見つけたとしても、システムの複雑さとテストの必要性は 2 倍になります。

ダ・ヴィンチ・マシン

Da Vinci Machine は実験用としては優れていますが、標準の JVM ではないため、その機能をどこでも利用できるわけではありません。実際、ほとんどのプロダクション環境では、ダ ヴィンチ マシンの使用が明確に禁止されているのではないかと思います。したがって、これを使用してクールな実験を行うことはできますが、現実の世界にリリースする予定のコードには使用できません。

これには、上記の JVM バイトコード操作ソリューションと同様の問題も追加されています。代替スタック (Android など) では機能しません。

JNI の実装

このソリューションは、Java でこれを行うポイントをまったく意味のないものにします。CPU とオペレーティング システムの組み合わせごとに独立したテストが必要であり、それぞれが苛立たしい微妙な障害のポイントになる可能性があります。もちろん、別の方法として、1 つのプラットフォームに完全に縛り付けることもできますが、これもまた、Java で何かを行うという意味を完全に無意味にします。

そう...

これらの 4 つの手法のいずれかを使用せずに Java でコルーチンを実装する方法はありますか? それとも、これら 4 つのうち最も臭いの少ないもの (JVM 操作) を代わりに使用することを余儀なくされますか?


追加するために編集:

混乱が含まれないようにするために、これは私の他の質問に関連する質問ですが、同じではありません。不必要に車輪の再発明を避けるために、既存の実装を探しています。これは、Java でコルーチンを実装する方法に関する質問です。その意図は、さまざまな質問をさまざまなスレッドに保持することです。

0 投票する
1 に答える
1930 参照

android - Kotlin コルーチンは完了するのを待ちません

バックエンドに接続するときにコルーチンを使用したいレガシー プロジェクトがあります。バックエンドは、Hybris が提供する SDK によって処理されています。たとえば、ボレーを使用し、いくつかのコールバックを使用します。私が望むのは、これらのコールバックをコルーチンでラップすることです。しかし、私が抱えている問題は、コルーチンが完了するのを待たず、コルーチンを開始し、次の行に進み続け、メソッドが値を返し、その後ずっとコルーチンが終了することです。私のコード:

ヘルパー メソッド:

コルーチンが呼び出される場所:

そのため、完了するのを待つ代わりに、serviceHelper.wishLists().await()リストを返します。また、メソッドが を返すようにしようとしましたrunBlocking{}が、それは UI スレッドをブロックするだけで、コルーチンを終了しません。