Вызов асинхронного метода синхронно на основе условия

#java #multithreading #asynchronous

Вопрос:

Я наткнулся на сценарий, в котором метод должен быть вызван синхронно в случае 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";
     }
 }
 

}

Комментарии:

1. В вашем вопросе отсутствует жизненно важная информация. Пожалуйста, продолжайте и обновите его более конкретным примером и/или, возможно, поделитесь тем, что вы уже сделали, чтобы кто-то мог вам помочь.

2. Создайте два метода, sync и async, и вызовите общий метод, который содержит общую логику обоих методов. Затем в соответствии с вашими критериями вызовите любой из методов синхронизации или асинхронности.

3. @Async Откуда взялась аннотация Spring ?

Ответ №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";
        }
    }
}
 

Между тем, вы должны иметь в виду, что это довольно тривиальное решение и не является:

  • примите во внимание безопасность потоков, учитывая ограничения вашего домена
  • используйте любые базовые средства платформы