#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";
}
}
}
Между тем, вы должны иметь в виду, что это довольно тривиальное решение и не является:
- примите во внимание безопасность потоков, учитывая ограничения вашего домена
- используйте любые базовые средства платформы