Как правильно использовать SimpleAsynctaskexecutor, когда нужно ждать, пока все виртуальные потоки закончится?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно использовать SimpleAsynctaskexecutor, когда нужно ждать, пока все виртуальные потоки закончится?

Сообщение Anonymous »

Как правильно использовать 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»