Wie verwendet ich SimpleAntaskexecutor richtig, wenn es darauf warten muss, dass alle virtuellen Threads fertiggestellt
Posted: 16 Mar 2025, 16:00
Wie man SimpleAsynctaskexecutor richtig verwendet, wenn es darauf warten muss, dass alle virtuellen Threads fertiggestellt werden? Diese Concurrenthashmap enthält Daten, die dann zum Senden per E -Mail an Benutzer verwendet werden. Sobald sie alle ihren Job beendet haben, möchte ich die E -Mails nacheinander senden. Hiob. Ich möchte darauf warten, dass alle virtuellen
-Threads (VT) fertiggestellt werden, bevor die E -Mails mit den Daten gesendet werden. Probleme verursachen? Ich möchte, dass nur 4 Threads gleichzeitig laufen, während andere darauf warten, dass „freie Slots“ ausgeführt werden. Kann ich mehr als 4 Anrufläte hinzufügen oder muss sie hinzufügen, wie andere virtuelle Threads abgeschlossen sind?
-Threads (VT) fertiggestellt werden, bevor die E -Mails mit den Daten gesendet werden. Probleme verursachen? Ich möchte, dass nur 4 Threads gleichzeitig laufen, während andere darauf warten, dass „freie Slots“ ausgeführt werden. Kann ich mehr als 4 Anrufläte hinzufügen oder muss sie hinzufügen, wie andere virtuelle Threads abgeschlossen sind?
Code: Select all
@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");
}
}