0

メインスレッドのコンテキスト内でコールバックが呼び出されるようにするにはどうすればよいですか?

私はActiveMQを使用しており、具体的には、activemqコンシューマーを作成したスレッドのコンテキスト内でコールバックが確実に実行されるようにする方法を理解しようとしています。

リスナー/ハンドラーで取得するスレッドIDは、コンシューマーを作成してリスナーを設定したものとは異なるため、ハンドラー/リスナーのコードが最初のスレッドスレッドで実行されるようにする方法を理解しようとしています。

リスナーでコードを実行するスレッドを作成した場合は、ExecutorとFutureを使用した可能性がありますが、activemqによって作成されたため、リスナーを次のコンテキスト内で実行する方法を理解したいと考えていました。 'メイン'スレッド。

次に、一般的なJavaスレッドコールバックについて読み始めました。ほとんどの記事では、runnableを実装するスレッドに渡すクラスでメソッドを呼び出す方法について説明しています。そのコールバック内のコードは、私が生成したスレッドのコンテキスト内にあるように見えます。

..では、メインスレッドのコンテキスト内でコールバックが呼び出されるようにするにはどうすればよいですか?

.netではSynchronizationContextを使用でき、WPFではこのコンテキストを内部で使用するDispatcherを使用できます。

私は同期されたメソッドを見てきましたが、それらのメソッドは別のスレッド、つまり「メイン」スレッドで定義されたデータ変数にアクセスしているようです。私の場合、変数/データはコンシューマースレッドで作成され、それらを返す必要があります/それらが「メイン」スレッドで使用可能であることを確認します。

4

1 に答える 1

0

興味深い問題です。最初に行うことは、どのスレッドが実行されているかを確認することです。簡単な方法は、次の print ステートメントをコールバックに入れることです。 System.out.println(Thread.currentThread());

特定のスレッドでメソッドを実行する限り、そうは思わないでください。スレッドのコンテキストの取得は、Java の一部ではありません。.Net とは異なり、JVM はさまざまな会社によって作成されている場合があります。本当に良いものとしてのIBM。Oracle の JRocket も別です。そのため、ボンネットの下に入るのはそれほど簡単ではありません。

もう少し調べてみて、見つかったらお知らせします。

于 2013-02-08T16:41:55.947 に答える