10

Meine Frage an diesem sehr ähnlich ist: @Async prevent a thread to continue until other thread have finishedFrühling @Async Limit Anzahl der Threads

Grundsätzlich i laufen müssen in mehreren Threads ~ Hunderte von Berechnungen. Ich möchte nur eine gewisse Anzahl von parallelen Threads z. 5 Threads mit 5 requirementsis in parallell.

Ich benutze Federrahmen und @ Async-Option ist die natürliche Wahl. Ich brauche keine voll funktionsfähige JMS-Warteschlange, das ist ein wenig Aufwand für mich.

Irgendwelche Ideen? Vielen Dank

Antwort

12

Haben Sie Task Executor ausgecheckt? Sie können einen Thread-Pool mit einer maximalen Anzahl von Threads definieren, um Ihre Aufgaben auszuführen.

Wenn Sie es mit @Async verwenden möchten, verwenden Sie diese in Ihrer Feder-config:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/> 

<task:executor id="myExecutor" pool-size="5"/> 

<task:scheduler id="myScheduler" pool-size="10"/> 

Vollreferenz here (25.5.3). Hoffe das hilft.

16

Wenn Sie Spring Java-Konfiguration verwenden, muss der Config-Klasse AsyncConfigurer implementiert:

@Configuration 
@EnableAsync 
public class AppConfig implements AsyncConfigurer { 

    [...] 

    @Override 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(2); 
     executor.setMaxPoolSize(5); 
     executor.setQueueCapacity(50); 
     executor.setThreadNamePrefix("MyExecutor-"); 
     executor.initialize(); 
     return executor; 
    } 
} 

Siehe @EnableAsync Dokumentation für weitere Details: http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html

+0

was ist, wenn ich mehrere asyncs brauchen? – Dejell

+0

Sie können mehrere Methoden mit '@ Async' annotieren, und sie teilen sich den Thread-Pool/Executor, der mit' @ EnableAsync' konfiguriert wurde. – Siggen

+0

Ich meine - mehrere Executoren mit verschiedenen Konfigurationen für jede – Dejell