2

これは基本的な質問かもしれませんが、このフォーラムから確認を得たいと思っています。

私は以下のコードロジックを持っています:

public Object method1() {
 synchronized(this) {
  method2();
  method3();
  method4();
}

method4()時間のかかる操作であり、完了するまで待つ必要はありません。method4そこで、呼び出しをインターセプトして別のスレッドで実行するスプリング メソッド インターセプターを作成しました。ここで私の質問は、メソッド 4 の実行が開始された直後にメソッド 1 が返されるかどうかです。

以下はインターセプターのコードです。

public Object invoke(MethodInvocation methodInvocation) throws Throwable {
    Future<Object> future = executorService.submit(new AsyncCallable(
            methodInvocation));
    Object retVal = null;
    try {
        retVal = future.get(10, TimeUnit.SECONDS);
    } catch (Exception e) {
        logger.error("Exception while running the method Async", e);
        throw e;
    }
    return retVal;
} //AsyncCallable implements Callable interface
4

1 に答える 1

2

記載:method4()時間のかかる操作であり、完了するまで待つ必要はありません。

わかりました、スレッド化はそのための良い解決策です。ただし、まさにそのステートメントによって、あなたが望むのはすぐに戻ることであり、同期されたブロックをすぐに終了することが示唆されました。

では、最初の質問: それはあなたが本当に望んでいることですか? 多分そうではない...多分。同期されたブロックの外で安全に処理できる場合method4は、そのブロックの外に移動します。それが安全でない場合、おそらくあなたがしたいことはインターセプト(およびスレッド)method1ですか?


一方、 に戻りmethod4ます: コード化されているように、インターセプトが介入し、未来を作成し、未来が完了するまで最大 10 秒間待機します。その後、インターセプトが返されます (完了またはタイムアウト)。制御は method1 に戻り、ブロック/同期ループを終了します。

于 2012-08-07T22:20:42.640 に答える