戻り値を取得するJavaマルチスレッドは、最初に中間のビジネスコードを実行し、フロントコードとビジネスコードは並列であり、ビジネス前のコードの実行を待ち、ビジネス後のコードを実行します

回路図

メインスレッド:緑色の線、ビジネスコードの直接実行の要求、およびビジネスコード実行への即時応答
非同期スレッド1:要求ログの記録
非同期スレッド2:要求ログの記録によって返されたデータを取得し、データに応答ログを挿入します(ここビジネスコードがFinishedを実行しているが、スレッドがまだ実行されているとすぐに、スレッドの実行が終了するのを待ってから、スレッドを実行する2)
ここに画像の説明を挿入します

1.スレッドプールを定義します

  /**
     * 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
     */
    final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

2.非同期スレッドをオンにして、logメソッドを実行します

fixedThreadPool.submit実行スレッドを使用します。遺言を実行するスレッドを使用future.get()して戻り値を取得できます。

      // 1、记录请求日志, 将异步执行(与业务代码并行处理),不影响程序响应, future 为线程的返回值,用于后面异步执行响应结果
        Future<AdminLog> future = fixedThreadPool.submit(new Callable<AdminLog>() {
    
    
            @Override
            public AdminLog call() {
    
    
                return log(proceed, sra.getRequest(), sra.getResponse());
            }
        });

3.ビジネスメソッドを実行する

 // 执行业务
 Object obj = proceed.proceed();

4.ビジネスの非同期実行後のコード

future.isDone()は、非同期スレッドでログを実行するメソッドが完了したかどうかを判別でき、完了後に戻り値を取得できます。

  // 异步记录请求结果
  fixedThreadPool.execute(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                while (true) {
    
    
                    // 判断记录请求日志是否记录完成(true=完成)
                    if (future.isDone()) {
    
    
                        AdminLog log = null;
                        try {
    
    
                            log = future.get();
                        } catch (Exception e) {
    
    
                            e.printStackTrace();
                        }
                        updLog(log.getId(), state, executeTime, businessTime, obj);
                        break;
                    }
                }
            }
        });

おすすめ

転載: blog.csdn.net/qq_41463655/article/details/109393027