Timeout sur pool de threads
Hello,
Sur conseil d'un autre topic, j'ai fait un Timeout comme ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| public class Timeout {
private Timeout() {}
private static final ScheduledExecutorService TIMER = Executors.newSingleThreadScheduledExecutor();
public static void timeout(final Future<String> source, long delay, TimeUnit unit) {
Runnable cancel = new Runnable() {
public void run() {
source.cancel(true);
}
};
TIMER.schedule(cancel, delay, unit);
}
} |
Pour gérer les timeout sur un pool de threads. Cela fonctionne bien tant que le pool n'est pas plein, par exemple comme ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11
| Executor executor = Executors.newFixedThreadPool(2);
CompletionService<String> completionService =
new ExecutorCompletionService<String>( executor );
Future<String> resultTemp = null;
for(int i=0;i<2;i++){
resultTemp = completionService.submit( new Th1(text+i) );
Timeout.timeout(resultTemp, 3000L, TimeUnit.MILLISECONDS);
}
... |
Mais, si, par exemple je remplace
Code:
Executor executor = Executors.newFixedThreadPool(2);
Par
Code:
1 2
|
Executor executor = Executors.newFixedThreadPool(1); |
Le problème est que le timeout part du moment ou le thread est mis en queue et non du moment ou il est lancé... Ainsi, si le premier prends pas mal de temps, le timeout du premier est déjà terminé avant même qu'il n'ait commancé!!
Comment je peux résoudre cela?
Merci d'avance.
A+