生成された子インターフェイスのコールバックから既存のスレッドに戻ろうとしています。誰かが方法を知っていますか?コールバックの実装は、実装クラスではなく、呼び出された場所の子スレッドから常に実行されます。
4 に答える
スイッチバック とはどういう意味ですか?
子スレッドを生成した「元の」スレッドに戻るコンテキストスイッチを引き起こしますか?
もしそうなら、これは不可能です。マルチスレッドの概念と矛盾します。
「子」スレッドの実行中に「元の」スレッドで何らかの作業を実行したい場合は、
子スレッドと元のスレッド (つまり、プロデューサー/コンシューマー) の間にキューを配置することを検討できます。
子スレッドは「ジョブ」をキューに入れ、「元の」スレッドがそれを消費します。
ただし、「元の」スレッドは「子」スレッドでブロックする必要があります。
これを実装する別の方法は、待機と通知を使用することです (子スレッドが通知します) - ただし、元のスレッドは待機する必要があります。
最後のアプローチは、子スレッドの実行の最後に元のスレッドに戻りたい場合は、子スレッドの実行が終了するのを単に待つことです。問題は、元のスレッドでの待機がシナリオで受け入れられるかどうかです。
オブジェクトに呼び出しスレッドwait()
があり、子スレッドnotify()
に同じオブジェクトがあるだけです。
がwait()
呼び出されると、呼び出し元のスレッドは停止します。
がnotify()
呼び出されると、待機中のスレッドがウェイクアップして続行します。
synchronized
これらの呼び出しは、ブロック/メソッド内で行う必要があります。
これもタグ付けjava-ee
されているので、どの Java EE アプリケーション サーバーでもスレッドを開始することは許可されていないことを述べておきます。いくつかの問題が発生します。
- スレッドリソースのサーバーをブリードしやすい
- アプリケーションのアンデプロイを防ぐことができます
- スレッドがデーモンとしてマークされていない場合、サーバーのシャットダウンを防ぐことができます
- JNDI、トランザクション、セキュリティなどの機能の喪失
それは一般的にノーノーです。@Asynchronous
代わりに、コンテナーの協力により安全に fork/join の種類のロジックを簡単に実行できるアノテーションを調べることができます。
@Asynchronous
この回答には、サンプル コードhttps://stackoverflow.com/a/6158773/190816を含む、メソッドがどのように機能するかについての非常に完全な説明があります。