Как правильно использовать SimpleAsynctaskexeCutor, когда ему необходимо ждать, пока все виртуальные потоки будут закончены? Этот concurrenthashmap содержит данные, которые затем используются для отправки по электронной почте пользователям. Как только они все закончат свою работу, я хочу последовательно отправлять электронные письма. job. Я хочу ждать, пока все виртуальные
потоки (VT) завершится перед отправкой электронных писем с данными. причинить мне проблемы? Я хочу, чтобы только 4 потока работали одновременно, в то время как другие ждут, пока будут запускать «свободные слоты». Могу ли я добавить более 4 Callables, или я должен добавить их в качестве других виртуальных потоков?@Component
@Configuration
public class NotificacoesListener {
...
private ExecutorCompletionService getTaskExecutor() {
SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
taskExecutor.setVirtualThreads(true);
taskExecutor.setConcurrencyLimit(4);
ExecutorCompletionService executorCompletionService = new ExecutorCompletionService(taskExecutor);
return executorCompletionService;
}
...
@Scheduled(cron = MySettings.NOTIFICATION_SUB_SYSTEM_EVERY_NIGHT, zone = "GMT-3:00")
@Transactional
public void start() {
System.out.println("Starting at " + Utils.formatDate(LocalDate.now()) + " ...");
...
ConcurrentHashMap map = new ConcurrentHashMap();
ExecutorCompletionService executorCompletionService = getTaskExecutor();
int virtualThreadsRunning = 0;
//
for (Verifica instancia : instancias) {
virtualThreadsRunning++;
executorCompletionService.submit(new Callable() {
@Override
public Object call() throws Exception {
instancia.verifica(tenants, map);
return true;
}
});
}
while (virtualThreadsRunning > 0) {
try {
executorCompletionService.take();
} catch (InterruptedException ex) {
ex.printStackTrace();
} finally {
virtualThreadsRunning--;
}
}
sendEmails(map);
System.out.println("END");
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... r-all-virt