【问题标题】:Call async method synchronously based on a condition根据条件同步调用异步方法
【发布时间】:2021-11-17 14:45:15
【问题描述】:

我遇到了一个场景,在需要执行 1 个任务并将响应发送回调用者的情况下,需要同步调用一个方法。如果要执行多个任务,则需要异步调用相同的方法。如何在 Java 中实现这一点?

public class Validator{

 @Async
 public String Validate(List<DataRecord> records){
 // Runs validation
 }

 public String processRecords(List<DataRecord> records){
     if(records.size <=5 ){
         // call method validate synchronously and return response
          return validate(records)
     }
     else{
         // Call method validate asynchronously
         validate(records)
         return "Records are being validated please visit the page after some time";
     }
 }

}

【问题讨论】:

  • 您的问题缺少重要信息。请继续使用更具体的示例对其进行更新和/或可能分享您已经完成的工作,以便有人能够帮助您。
  • 创建两个方法,同步和异步,并调用包含两个方法的公共逻辑的公共方法。然后根据您的条件,调用任何同步或异步方法。
  • @Async 注解是否来自Spring

标签: java multithreading asynchronous


【解决方案1】:

您可以简单地将相同的方法调用(在这种情况下是您的任务)包装在一个 Runnable 中,提交给一个 Executor 以进行异步执行,否则内联调用该方法:

public class Validator {

    private final ExecutorService validatorExecutor = Executors.newFixedThreadPool(5);

    public String validate(List<DataRecord> records){
        // Runs validation
    }

    public String processRecords(List<DataRecord> records){
        if(records.size <=5 ){
            // call method validate synchronously and return response
             return validate(records)
        } else {
            validatorExecutor.submit(() -> this.validate(records));
            return "Records are being validated please visit the page after some time";
        }
    }
}

同时,您应该记住,这是一个非常简单的解决方案,而不是:

  • 考虑到您的域限制,考虑任何线程安全
  • 使用任何底层框架工具

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2020-12-19
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多